この単純なコードに問題があり、c# がこのように動作する理由がわかりません。
問題は、リスト内でリストを使用するときに、c# が値の代わりに Linq 式参照を使用することです。
番号のループでは、リストに基づいて番号を選択します。それらはすべて存在するため、すべての番号をリスト {1,2,3} に追加する必要があります。
数値ループ内に {1,2,3} が表示されているコンソールからの出力を見ると、動作は問題ありません。
問題はリストのループにあります。ここでは、Linq は最後の番号のみをリストに追加するように見えるため、{3,3,3} を出力します。
リスト内にintのリストが必要ないことはわかっていますが、それは非常に奇妙であることを証明するためのものです。これは既知の「バグ」ですか?
編集:これは、5.0 より前の c# で動作するはずの方法のようです。C# 5.0 (VS2012+ コンパイラ) では、この動作は期待どおりに変更されました。
static void Main()
{
var list = new List<IEnumerable<int>>();
var numbers = new[] {1, 2, 3};
var numbers2 = new[] {1, 2, 3};
foreach (var number in numbers)
{
var result = from s in numbers2
where s == number
select s;
Console.WriteLine(result.First()); // outputs {1,2,3}
list.Add(result);
}
foreach (var num in list)
{
Console.WriteLine(num.First()); // outputs {3,3,3}
}
}
出力
1 2 3 3 3 3