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

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

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

Re[5]: Dictionaryにおける要素の順序について


(過去ログ 127 を表示中)

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

■75513 / inTopicNo.1)  Dictionaryにおける要素の順序について
  
□投稿者/ ぶなっぷ (23回)-(2015/04/01(Wed) 14:57:17)

分類:[.NET 全般] 

2015/04/01(Wed) 14:58:06 編集(投稿者)
System.Collections.Generic.Dictionaryについての質問です。

このクラスは連想配列を実装しています。
私の認識では連想配列は要素の順序を保存しないと考えています。

しかし、順番に要素を Add() した後、foreach()で回すとAdd()した順番通りに要素
が取得できます。

また、以下のようにして、できあがったDictionaryをforeach()で回すと、ちゃんと
ソートされた順序で要素が取得できます。
----------------------------------------------------
  int[] NumAry = { 9, 2, 5, 6, 10, 3, 4, 1, 7 };
  var NumList = NumAry.ToList();
  NumList.Sort();                        // ここでソート
  var NumDic =
    NumList.ToDictionary(Item => Item);  // Dictionary化でソート結果を忘れる?
  foreach (var Num in NumDic.Values)
  {
    Trace.Write(Num + ", ");
  }
----------------------------------------------------
[結果]
1, 2, 3, 4, 5, 6, 7, 9, 10, 
----------------------------------------------------

もしかして、Dictionaryは要素の順序を記憶しているのでしょうか?

引用返信 編集キー/
■75514 / inTopicNo.2)  Re[1]: Dictionaryにおける要素の順序について
□投稿者/ Hongliang (300回)-(2015/04/01(Wed) 15:04:26)
https://msdn.microsoft.com/ja-jp/library/vstudio/xfhwa508%28v=vs.100%29.aspx
に書かれてある、
> 列挙処理のために、ディクショナリ内の各アイテムは、値とそのキーを表す KeyValuePair<TKey, TValue> 構造体として処理されます。 アイテムが返される順序は未定義です。
が解答の全てです。
たまたま、現在の実装として挿入順に返しているのかもしれませんが、それに依存したコードは将来にわたった動作を保証できません。
引用返信 編集キー/
■75515 / inTopicNo.3)  Re[1]: Dictionaryにおける要素の順序について
□投稿者/ 魔界の仮面弁士 (274回)-(2015/04/01(Wed) 15:17:30)
No75513 (ぶなっぷ さん) に返信
> 私の認識では連想配列は要素の順序を保存しないと考えています。
すべての連想配列は順序を保存しない、という意味でしょうか?


> ソートされた順序で要素が取得できます。
順序を保証したいのであれば、SortedDictionary<TKey, TValue> クラスを使いましょう。
引用返信 編集キー/
■75516 / inTopicNo.4)  Re[2]: Dictionaryにおける要素の順序について
□投稿者/ ぶなっぷ (24回)-(2015/04/01(Wed) 15:36:33)
みなさん、ありがとうございます。
やはり、そうですよね。

開発メンバーの他の人が書いたソースコードで、順序を期待しているコードがあって、それでも(順序が
崩れたら不具合の発生するコードなのに)不具合無く動いているんで、
「あれっ?」
と思ったんですね。

で、自分でサンプルを書いても順序を記憶しているかのような結果でしたので疑問に思い質問させてい
ただいた次第です。

> 列挙処理のために、ディクショナリ内の各アイテムは、値とそのキーを表す KeyValuePair<TKey, TValue> 構造体として処理されます。 アイテムが返される順序は未定義です。
と書かれている以上、問題のコードは修正したいと思います。

最後に、以下の件ですが、
>> 私の認識では連想配列は要素の順序を保存しないと考えています。
>すべての連想配列は順序を保存しない、という意味でしょうか?

と思っているんですが、例外あるんですか?

引用返信 編集キー/
■75517 / inTopicNo.5)  Re[3]: Dictionaryにおける要素の順序について
□投稿者/ なちゃ (30回)-(2015/04/01(Wed) 15:48:23)
No75516 (ぶなっぷ さん) に返信
> >> 私の認識では連想配列は要素の順序を保存しないと考えています。
> >すべての連想配列は順序を保存しない、という意味でしょうか?
>
> と思っているんですが、例外あるんですか?

順序が不定という仕様の連想配列は、いわゆる実装依存ですが、順序を仕様として明示しているタイプの連想配列もあります。

Dictionaryは不定のタイプで、内部的にはバケット順つまり基本ハッシュコード順、SortedDictionaryはキーでソートされる仕様、OrderedDictionryという追加順保証なんてのもありました。

見た目キー順になったのは、数値のハッシュコードが数値そのままという実装になっているからでしょう。
もっと大きい数値を入れるとバラバラになると思います。
引用返信 編集キー/
■75518 / inTopicNo.6)  Re[4]: Dictionaryにおける要素の順序について
□投稿者/ なちゃ (31回)-(2015/04/01(Wed) 15:52:24)
あ、数値のハッシュコードと書きましたが、ハッシュコードの提供の仕方も色々複雑になってるので、ちょっとややこしいかも知れません。
引用返信 編集キー/
■75519 / inTopicNo.7)  Re[5]: Dictionaryにおける要素の順序について
□投稿者/ ぶなっぷ (25回)-(2015/04/01(Wed) 16:00:03)
みなさん、ありがとうございます。

すいません見落としていました(^^;
SortedDictionary, OrderedDictionry
などは順序保証なのですね。

全ての疑問がすっきりしましたのでクローズします。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -