Dictionaryをforeachしたときに取得される順番って
登録順という保証はないですよ、みたいなことを
前にどこかで読んだ気がしますが、
どれくらい一致しない物なのか試せないかなって思いました
サンプル
private void button1_Click(object sender, EventArgs e)
{
int sameCnt = 0;
int diffCnt = 0;
for (int j = 0; j < 100000; j++)
{
Dictionary<int, int> testDic = new Dictionary<int, int>();
Random rand = new Random();
List<int> testList = new List<int>();
for (int i = 0; i < 100; i++)
{
int num = rand.Next(1000);
testDic.Add(i, num);
testList.Add(num);
}
List<int> dicList = new List<int>();
foreach (int key in testDic.Keys)
{
dicList.Add(testDic[key]);
}
bool diffFlg = false;
for (int i = 0; i < 100; i++)
{
if (dicList[i] != testList[i])
{
diffFlg = true;
break;
}
}
if (diffFlg)
diffCnt++;
else
sameCnt++;
}
Console.WriteLine("順番が一致したDictionary数:" + sameCnt);
Console.WriteLine("順番が不一致のDictionary数:" + diffCnt);
}
{
int sameCnt = 0;
int diffCnt = 0;
for (int j = 0; j < 100000; j++)
{
Dictionary<int, int> testDic = new Dictionary<int, int>();
Random rand = new Random();
List<int> testList = new List<int>();
for (int i = 0; i < 100; i++)
{
int num = rand.Next(1000);
testDic.Add(i, num);
testList.Add(num);
}
List<int> dicList = new List<int>();
foreach (int key in testDic.Keys)
{
dicList.Add(testDic[key]);
}
bool diffFlg = false;
for (int i = 0; i < 100; i++)
{
if (dicList[i] != testList[i])
{
diffFlg = true;
break;
}
}
if (diffFlg)
diffCnt++;
else
sameCnt++;
}
Console.WriteLine("順番が一致したDictionary数:" + sameCnt);
Console.WriteLine("順番が不一致のDictionary数:" + diffCnt);
}
とりあえずForm上のbutton1クリックイベントで実行させてます
ランダムで0~999の数値をDictionaryとListに100個設定していきます
Listは登録順が保証されてたはず!なので比較用に使います
Dictionaryをforeachで取り出してListに設定したものと、
Dictionaryを登録するときに一緒に登録したListの値を比較して
どこか1か所でも不一致な部分を見つけたら不一致カウントを加算します
これを10万回繰り返して、一致した数と不一致になった数を出してみます
試行回数やランダムの範囲とかは適当です
実行結果
順番が一致したDictionary数:100000
順番が不一致のDictionary数:0
順番が不一致のDictionary数:0
入れた順は一致するそうです
3回ほど繰り返してみましたが同じ結果でした
とはいえ確実に保証します!と言われているわけでないなら
絶対登録順でとれるとは思いこまないほうが良いですよね
確実に登録順にforeachされる!と思い込んで実装した箇所は、
直ちに影響はないから今のところは不安になる必要が無いのかなって