c# - 为什么c#Linq在包含List的List中使用引用而不是值

标签 c# linq list

我在使用这段简单的代码时遇到了问题,我不明白为什么 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/

相关文章:

c# - MVC 4 - 更改密码错误 : "Index (zero based) must be greater than or equal to zero..."

c# - 如何使用 LINQ 在字典中查找元素

c# - 如何使用 O(n) 中的 LINQ 根据特定顺序查找第一项?

list - 在 scala 列表中查找元素并知道满足哪个谓词

c# - 如何为长时间运行的 Azure 函数创建启动代码?

c# - 我们什么时候必须在 C# 中使用隐式和显式运算符?

c# - 内存消耗 .Net 应用程序(Azure 网站)

c# - LINQ 和枚举

javascript - 使用 Javascript 访问 ASP session 变量

python - 使用同一 Dataframe 中另一列的 int 作为索引获取列中的列表值