我猜这是由于延迟执行,但我会认为给定 List.AddRange 函数接受一个 IEnumerable ,它将枚举要添加的项目。
确实如此。有一个短路ICollection<T>
(在这种情况下您不会遇到),这将导致它使用ICollection<T>.CopyTo
而不是枚举项目,否则,它将枚举集合。
对于一个工作示例,请尝试:
using System;
using System.Linq;
using System.Collections.Generic;
internal class Program
{
private static List<T> RunQuery<T>(IEnumerable<T> someCollection, Func<T, bool> predicate)
{
List<T> items = new List<T>();
IEnumerable<T> addItems = someCollection.Where(predicate);
items.AddRange(addItems);
return items;
}
static void Main()
{
var values = Enumerable.Range(0, 1000);
List<int> results = RunQuery(values, i => i >= 500);
Console.WriteLine(results.Count);
Console.WriteLine("Press key to exit:");
Console.ReadKey();
}
}
这将使用您的确切代码,并将打印出 500(正确的项目数List<T>
)。