我在使用这段简单的代码时遇到了问题,我不明白为什么 c# 会这样。
问题似乎是 c# 在使用 Lists inside Lists 时使用 Linq 表达式引用而不是值。
在数字循环中,我根据列表选择数字,它们都存在,因此所有数字都应添加到列表 {1,2,3} 中。
当您看到控制台的输出在数字循环内显示 {1,2,3} 时,行为正常。
问题出在列表的循环上,在这里,Linq 似乎只将最后一个数字添加到列表中,因此它输出 {3,3,3}。
我知道我不需要列表中的整数列表,但这只是为了证明一点它很奇怪,这是一个已知的“错误”吗?
编辑: 在 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
最佳答案
这个
list.Add(result);
没有达到您的预期。它不添加数字列表。 它添加了一个查询。查询是按需执行的。因为,在您的最终输出循环 number = 3
中,所有三个查询都返回 3
。
如果你想添加一个列表,通过附加 ToList
强制立即执行查询:
list.Add(result.ToList());
关于c# - 为什么c#Linq在包含List的List中使用引用而不是值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19403836/