为什么修改列表会影响筛选列表
本文关键字:列表 筛选 影响 为什么 修改 | 更新日期: 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();