【问题标题】:What is the relation between the IEnumerable produced by LINQ and the original list? [duplicate]LINQ 生成的 IEnumerable 与原始列表之间有什么关系? [复制]
【发布时间】:2023-02-09 22:46:30
【问题描述】:

我有以下代码行:

var list = new List<Test>() { new Test("Test1"), new Test("Test2") };
var enumerable = list.Where(t => t.Content == "Test1");

Console.WriteLine($"Enumerable count: {enumerable.Count()}");
Console.WriteLine($"List count: {list.Count}");

list.RemoveAll(t => t.Content == "Test1");

Console.WriteLine($"Enumerable count: {enumerable.Count()}");
Console.WriteLine($"List count: {list.Count}");

我希望输出是

Enumerable count: 1
List count: 2
Enumerable count: 1
List count: 1

但实际上,输出是

Enumerable count: 1
List count: 2
Enumerable count: 0
List count: 1

意味着从列表中删除对象,也将其从 IEnumerable 中删除。我以为我对面向对象编程的掌握相当牢固,但这种行为对我来说似乎非常意外。

谁能解释一下幕后发生了什么?我要补充一点,如果我将 .ToList() 添加到原始的 Where-statement,一切都会如我所料。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    LINQ 是惰性的,实际执行是 deferred 直到物化操作之一。将为每个此类操作枚举整个可枚举对象。这很容易观察到副作用:

    var enumerable = list
        .Where(t =>
        {
            Console.WriteLine("Test deffered: " + t.Content);
            return t.Content == "Test1";
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 2017-09-26
      • 2013-04-09
      • 2020-10-10
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多