C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.76836 の関連記事表示

<< 0 >>
■76836  C#のインデクサーの辞書クラスについてです
□投稿者/ EDF -(2015/08/24(Mon) 12:27:55)

    分類:[C#] 

    using System;

    /// <summary>
    /// Dictionary クラスの項目。
    /// </summary>
    internal class Item
    {
    public string key;
    public string value;
    public Item next;

    public Item(string key, string value, Item next)
    {
    this.key = key;
    this.value = value;
    this.next = next;
    }
    }

    /// <summary>
    /// 辞書クラス。
    /// </summary>
    class Dictionary
    {
    Item head;

    public Dictionary()
    {
    this.head = new Item(null, null, null);
    }

    public string this[string key]
    {
    set
    {
    for(Item item = this.head.next; item != null; item =item.next)
    if(item.key == key)
    {
    item.value = value;
    return;
    }
    this.head.next = new Item(key, value, this.head.next);
    }
    get
    {
    for(Item item = this.head.next; item != null; item =item.next)
    if(item.key == key)
    return item.value;
    return null;
    }
    }
    }

    class IndexerSample
    {
    static void Main()
    {
    Dictionary dic = new Dictionary();

    dic["ハァ"] = "( ゚Д゚)?";
    dic["ハァハァ"] = "(;´Д`)";
    dic["ポカーン"] = "( ゚д゚)";
    dic["オマエモナ"] = "(´∀`)";

    Console.Write(dic["ハァハァ"]);
    }
    }

    ソースコードはこちらからhttp://ufcpp.net/study/csharp/oo_indexer.html
    このコードのインデクサー部分がなにをしているのかわかりません・・・・
    特にnextの部分なんかは定義が足りないように見えてしまいます・・・
    インデクサーはまだあまり慣れていないのでこれでもかというくらいこのコードに
    ついて教えていただけるとありがたいです。
親記事 /過去ログ130より / 関連記事表示
削除チェック/

■76840  Re[1]: C#のインデクサーの辞書クラスについてです
□投稿者/ 魔界の仮面弁士 -(2015/08/24(Mon) 13:06:54)
    2015/08/24(Mon) 14:28:49 編集(投稿者)

    この掲示板の利用ルールでは
     『半角カナは使用しないでください。文字化けの原因になります。』
    となっていますので、該当箇所は全角カナに置き換えて投稿します。


    No76836 (EDF さん) に返信
    > このコードのインデクサー部分がなにをしているのかわかりません・・・・
    Item のインスタンスが数珠繋ぎになっています。

    Console.Write の行で一時停止させ、[デバッグ]-[ウィンドウ]メニューの
    「ローカル」ウィンドウで 変数 dic を調べると、変数 dic 内では
    下記のように、階層的にデータ管理されていることがわかります。


    【dic】
     ┗head (Item型)
      ├[key]
      ├[value]
      └[next] = (別のItem)

    ※実際のローカルウィンドウでは、アルファベット順に key, next, value と表示されます。



    そしてこの next を展開していくと、下記のようになります。
    http://www.vb-user.net/junk/replySamples/2015.08.24.13.10/20150824.png

    【dic】
     ┗head ☆0番目のItem(ルート)
      ├[key] = null (未使用)
      ├[value] = null (未使用)
      └[next] = ★1番目のItem
       ├[key] = "オマエモナ"
       ├[value] = "(´∀`)"
       └[next] = ★2番目のItem
        ├[key] = "ホ゜カーン"
        ├[value] = "( ゜д゜)"
        └[next] = ★3番目のItem
         ├[key] = "ハァハァ"
         ├[value] = "(;´Д`)"
         └[next] = ★4番目のItem
          ├[key] = "ハァ"
          ├[value] = "( ゜Д゜)?"
          └[next] = ◆終端(5番目のItem = null)


    今回の Dictionary のインデクサは、最初に .head.next を参照します。
    つまり、「★1番目のItem」の階層です。これは "オマエモナ" という "(´∀`)" のインスタンスです。


    まずはインデクサの getter の動作についてですが:

    もし、インデクサの引数 key が "オマエモナ" と一致していれば、
    対応する .value 値すなわち "(´∀`)" を返します。

    一致しない場合は、次の .next をさらに辿ります。
    これを繰り返し、今回の "ハァハァ" に対応する「★3番目のItem」を
    取得し、その .value 値 "(;´Д`)" を返すという仕組みです。

    もし、一致する key が最後まで見つからなければ、null が返されます。



    setter の場合も、同様な捜索処置が行われています。

    setter では、.key が一致する Item が見つかれば、
    その .value を書き換えますが、.key の合致するものが見つからなければ、
    新たな Item を作り、それをリスト構造の先頭部に加えています。
記事No.76836 のレス /過去ログ130より / 関連記事表示
削除チェック/

■76841  Re[2]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF -(2015/08/24(Mon) 14:02:18)
    No76840 (魔界の仮面弁士 さん) に返信
    非常に分かりやすかったです。要望通り詳しく教えてくださってありがとうございました。
記事No.76836 のレス /過去ログ130より / 関連記事表示
削除チェック/

■76844  Re[2]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF -(2015/08/24(Mon) 14:05:19)
    No76840 (魔界の仮面弁士 さん) に返信
    一つお聞きしたのですが、インデクサー内部のforの部分はforeachではだめなのでしょうか?
    全部の要素との対応をみるならそれの方がいい気がしますが・・・
記事No.76836 のレス /過去ログ130より / 関連記事表示
削除チェック/

■76845  Re[3]: C#のインデクサーの辞書クラスについてです
□投稿者/ 魔界の仮面弁士 -(2015/08/24(Mon) 14:20:24)
    No76844 (EDF さん) に返信
    > 一つお聞きしたのですが、インデクサー内部のforの部分はforeachではだめなのでしょうか?

    while ループで実装することならば可能ですが、foreach にすることはできません。

    何故ならば、foreach を使うにはイテレーターが必要になりますが、
    今回の Dictionary クラスには、それが実装されていないためです。

    詳しく知りたい場合には、「IEnumerable」「IEnumerator」というキーワードで調べてみてください。




    なお、System.Collections.Generic 名前空間や System.Collections.ObjectModel 名前空間には、
    各パターンに対応したコレクションクラスが揃っています。そのため実際には、今回のように
    自作のコレクションが必要になる場面というのは、それほど多くありません。
記事No.76836 のレス /過去ログ130より / 関連記事表示
削除チェック/

■76837  Re[1]: C#のインデクサーの辞書クラスについてです
□投稿者/ 774RR -(2015/08/24(Mon) 12:53:40)
    インデクサが何かは、提示解説ページの内容で十分説明されているような気がする。
    「これでもか」というほどの解説を行うには掲示板のスペースは足らないし
    直接対面して会話する場合ほどの応答速度も得るべくもないので無意味な気がする。

    というわけで定番だけど「どこがわからないのかもっと限定しておくれ」

    これはリスト構造だよ線形片方向リスト
    https://ja.wikipedia.org/wiki/%E9%80%A3%E7%B5%90%E3%83%AA%E3%82%B9%E3%83%88
    わからないのはインデクサでなくて「リスト構造」なのでは?

    括弧 { } のつけ方が標準的でないのでびっくらこいただよ...
記事No.76836 のレス /過去ログ130より / 関連記事表示
削除チェック/

■76839  Re[2]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF -(2015/08/24(Mon) 13:06:48)
    No76837 (774RR さん) に返信
    特にわからないところですか・・・
    インデクサーのif文のところは一体何をしているのかわかりません
    右辺のkey はどこを参照しているのでしょうか?
記事No.76836 のレス /過去ログ130より / 関連記事表示
削除チェック/

■76842  Re[3]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF -(2015/08/24(Mon) 14:02:45)
    解決済み
記事No.76836 のレス / END /過去ログ130より / 関連記事表示
削除チェック/

■76847  Re[4]: C#のインデクサーの辞書クラスについてです
□投稿者/ 774RR -(2015/08/24(Mon) 14:32:00)
    set 側 : foreach はコレクションを変更してはならないので使っちゃダメ
    get 側 : foreach を使うようにすることは可能

    foreach を使うには IEnumerable を実装する必要がある。
    元ネタの記事はインデクサの説明だ。インターフェイスを知らない読者にとっても理解できるように
    わざと for で書いているんだと思うぞ。
    説明はシンプルにってことだ。
記事No.76836 のレス /過去ログ130より / 関連記事表示
削除チェック/

■76854  Re[5]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF -(2015/08/24(Mon) 16:19:05)
    774RRさんと魔界の仮面弁士さんありがとうございました。
    違った側面からの解説をしていただき理解が深まりました。
記事No.76836 のレス /過去ログ130より / 関連記事表示
削除チェック/

■76865  Re[6]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF -(2015/08/24(Mon) 20:55:11)
    解決
記事No.76836 のレス / END /過去ログ130より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -