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

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

C# と VB.NET の入門サイト

Re[6]: C#のインデクサーの辞書クラスについてです


(過去ログ 130 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■76836 / inTopicNo.1)  C#のインデクサーの辞書クラスについてです
  
□投稿者/ EDF (8回)-(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の部分なんかは定義が足りないように見えてしまいます・・・
インデクサーはまだあまり慣れていないのでこれでもかというくらいこのコードに
ついて教えていただけるとありがたいです。

引用返信 編集キー/
■76837 / inTopicNo.2)  Re[1]: C#のインデクサーの辞書クラスについてです
□投稿者/ 774RR (297回)-(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
わからないのはインデクサでなくて「リスト構造」なのでは?

括弧 { } のつけ方が標準的でないのでびっくらこいただよ...

引用返信 編集キー/
■76839 / inTopicNo.3)  Re[2]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF (9回)-(2015/08/24(Mon) 13:06:48)
No76837 (774RR さん) に返信
特にわからないところですか・・・
インデクサーのif文のところは一体何をしているのかわかりません
右辺のkey はどこを参照しているのでしょうか?
引用返信 編集キー/
■76840 / inTopicNo.4)  Re[1]: C#のインデクサーの辞書クラスについてです
□投稿者/ 魔界の仮面弁士 (455回)-(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 を作り、それをリスト構造の先頭部に加えています。
引用返信 編集キー/
■76841 / inTopicNo.5)  Re[2]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF (10回)-(2015/08/24(Mon) 14:02:18)
No76840 (魔界の仮面弁士 さん) に返信
非常に分かりやすかったです。要望通り詳しく教えてくださってありがとうございました。
引用返信 編集キー/
■76842 / inTopicNo.6)  Re[3]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF (11回)-(2015/08/24(Mon) 14:02:45)
解決済み
解決済み
引用返信 編集キー/
■76844 / inTopicNo.7)  Re[2]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF (12回)-(2015/08/24(Mon) 14:05:19)
No76840 (魔界の仮面弁士 さん) に返信
一つお聞きしたのですが、インデクサー内部のforの部分はforeachではだめなのでしょうか?
全部の要素との対応をみるならそれの方がいい気がしますが・・・
引用返信 編集キー/
■76845 / inTopicNo.8)  Re[3]: C#のインデクサーの辞書クラスについてです
□投稿者/ 魔界の仮面弁士 (456回)-(2015/08/24(Mon) 14:20:24)
No76844 (EDF さん) に返信
> 一つお聞きしたのですが、インデクサー内部のforの部分はforeachではだめなのでしょうか?

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

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

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




なお、System.Collections.Generic 名前空間や System.Collections.ObjectModel 名前空間には、
各パターンに対応したコレクションクラスが揃っています。そのため実際には、今回のように
自作のコレクションが必要になる場面というのは、それほど多くありません。
引用返信 編集キー/
■76847 / inTopicNo.9)  Re[4]: C#のインデクサーの辞書クラスについてです
□投稿者/ 774RR (299回)-(2015/08/24(Mon) 14:32:00)
set 側 : foreach はコレクションを変更してはならないので使っちゃダメ
get 側 : foreach を使うようにすることは可能

foreach を使うには IEnumerable を実装する必要がある。
元ネタの記事はインデクサの説明だ。インターフェイスを知らない読者にとっても理解できるように
わざと for で書いているんだと思うぞ。
説明はシンプルにってことだ。

引用返信 編集キー/
■76854 / inTopicNo.10)  Re[5]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF (15回)-(2015/08/24(Mon) 16:19:05)
774RRさんと魔界の仮面弁士さんありがとうございました。
違った側面からの解説をしていただき理解が深まりました。

引用返信 編集キー/
■76865 / inTopicNo.11)  Re[6]: C#のインデクサーの辞書クラスについてです
□投稿者/ EDF (16回)-(2015/08/24(Mon) 20:55:11)
解決
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -