为什么修改列表会影响筛选列表

本文关键字:列表 筛选 影响 为什么 修改 | 更新日期: 2023-09-27 18:06:03

考虑以下示例:

List<String> myList = new List<string>();
myList.Add("Ford");
myList.Add("Porsche");
var filteredList = myList.Where(a => a.StartsWith("F"));
myList.Add("Ferrari");
foreach (string s in filteredList)
{
    Console.WriteLine(s);
}

输出为:

Ford  
Ferrari

当我创建过滤列表时,列表只包含:

Ford

为什么修改原始列表会影响过滤后的列表

为什么修改列表会影响筛选列表

LINQ是延迟求值的。这意味着filteredList在创建时不包含Ford。它所包含的只是对myList和您给它的lambda的引用。只有当您用foreach实际评估列表时,才会进行筛选。由于列表现在包含Ferrari,因此也会返回。

如果要强制提前进行评估,可以使用ToList()

var filteredList = myList.Where(a => a.StartsWith("F")).ToList();

这意味着评估将立即进行(而不是再次进行(。

因为您的filteredList不是列表。它是由LINQ生成的IEnumerable。它本身不是一个列表,而是一个基于原始列表的过滤器。

如果你希望你的filteredList是一个独立的列表,请这样做:

var filteredList = myList.Where(a => a.StartsWith("F")).ToList();