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

时间:2014-05-30 17:19:23

标签: c# linq

考虑以下示例:

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

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

2 个答案:

答案 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();