DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ArrayListとHashtableを組み合わせた配列の参照の仕方

環境/言語:[C# NET Framework3.5]
分類:[.NET]

現在ArrayList とHashtableを組み合わせた配列から値をどのように取るかで
悩んでいます。キャストを使ってみたのですがうまく参照できないでいます。

ご教授の方よろしくお願いします。

 ArrayList a = new ArrayList();
 string[] str1 = new string[]{"aaa","bbb","ccc"};

 for(int i=0;i<str1.Length;i++) {
  Hashtable h = new Hashtable();
  h["test"] = str1[i];
  a.Add(h);
 }

 foreach( var f in a) {
  Console.WriteLine(f["test"]);
  Console.WriteLine(f.test);
  Console.WriteLine((object)f.test);
  Console.WriteLine((DictionaryEntry)f.test);
 }

 Console.WriteLine(a[0].test);
■No26316に返信(たなかさんの記事)
> キャストを使ってみたのですがうまく参照できないでいます。

ArrayList の中に Hashtable を格納しているわけなので
> foreach (var f in a) {
列挙における変数 f は Hashtable ですよね。
f を Hashtable にキャストすると善いのではないでしょうか。

foreach (var f in a) {
    Console.WriteLine(((Hashtable)f)["test"]);
}

もしくは

foreach (Hashtable f in a) {
    Console.WriteLine(f["test"]);
}
■No26316に返信(たなかさんの記事)
> 現在ArrayList とHashtableを組み合わせた配列から値をどのように取るかで
> 悩んでいます。キャストを使ってみたのですがうまく参照できないでいます。

「うまく参照できない」が、どう「うまく」なのか説明してほしいと思ってみたり。
こちらで見てみましたが、Console.WriteLine の記述がエラーになっているのですね。

基本的にはもりおさんの回答の通りです。
> foreach (var f in a) {
の部分で、a が ArrayList なので f が Object として認識されています。
なので、f をいったん HashTable にキャストすることで参照可能になります。

あるいは a を ArrayList ではなく List<HashTable> で定義してあげてもよいかと。
ちょっと別の個所ですが、

■No26316に返信(たなかさんの記事)
>  for(int i=0;i<str1.Length;i++) {
>   Hashtable h = new Hashtable();
>   h["test"] = str1[i];
>   a.Add(h);
>  }

これだとハッシュテーブルに格納するキーが同一ですので、
結局一つしか格納されないことになりませんか?
ご返信ありがとうございます。

もりおさん

Hashtableを指定したところ無事参照することができました。
またキャストの使い方とても参考になりました。
どうもありがとうございます!

>foreach (Hashtable f in a) {
> Console.WriteLine(f["test"]);
>}

ぽぴ王子さん

Listを使った書き方だと後で宣言をしなくても
参照でき書き方がスマートになりますね。
ありがとうがとうございます!

List<Hashtable> b = new List<Hashtable>();
Hashtable h1 = new Hashtable();
h1["test"] = "aaaa";
b.Add(h1);
foreach(var dd in b) {
Console.WriteLine( dd["test"]);
}

なちゃさん

>これだとハッシュテーブルに格納するキーが同一ですので、
>結局一つしか格納されないことになりませんか?

そうでした。
h["test" + i] = str1[i];

ひとまず問題が解決しました。
ご教授ありがとうございました。
解決済み!
2010/01/25(Mon) 18:12:24 編集(投稿者)

■No26319に返信(なちゃさんの記事)
> ちょっと別の個所ですが、
>
> ■No26316に返信(たなかさんの記事)
>> for(int i=0;i<str1.Length;i++) {
>>  Hashtable h = new Hashtable();
>>  h["test"] = str1[i];
>>  a.Add(h);
>> }
>
> これだとハッシュテーブルに格納するキーが同一ですので、
> 結局一つしか格納されないことになりませんか?
>
ん? 元の処理では ArrayList の中に Hashtable が 3 つあって、
・1つめの Hashtable には "test" -> "aaa"
・2つめの Hashtable には "test" -> "bbb"
・3つめの Hashtable には "test" -> "ccc"
だから、もともと1つずつしか格納しようとしてないよ。

そもそも質問者がやりたいことが分からないから、これ以上は何とも言えないけど。

※若干言葉を補足。

DOBON.NET | プログラミング道 | プログラミング掲示板