考虑以下示例:
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
为什么修改原始列表会影响已过滤的列表?
答案 0 :(得分:7)
LINQ被懒惰地评估了。这意味着filteredList
在您创建时不包含Ford
。它包含的全部是对myList
和你给它的lambda的引用。当您使用foreach
实际评估列表时,会发生过滤。由于列表现在包含Ferrari
,因此也会返回。
如果您希望提前进行评估,可以使用ToList()
。
var filteredList = myList.Where(a => a.StartsWith("F")).ToList();
这意味着评估将在当时和那里(而不是再次)发生。
答案 1 :(得分:3)
因为您的filteredList不是列表。它是LINQ生成的IEnumerable。它不是一个列表本身,而是一个基于原始的过滤器。
如果您希望您的filteredList成为独立列表,请执行以下操作:
var filteredList = myList.Where(a => a.StartsWith("F")).ToList();