我知道IEnumerable已经在这里讨论过好几次了,但是我找不到具体问题的答案,所以我把它作为一个新问题提出来。IEnumerable的多次枚举
考虑下面的代码:
static void Main(string[] args)
{
List<string> testList = new List<string> {"Test", "Test1", "Test1"};
IEnumerable<string> filtered = testList.Where(x => x == "Test1");
DoSomeWork(filtered);
DoSomeMoreWork(filtered);
}
public static void DoSomeWork(IEnumerable<string> items)
{
foreach (var item in items)
{
Console.WriteLine("do some work");
}
}
public static void DoSomeMoreWork(IEnumerable<string> items)
{
foreach (var item in items)
{
Console.WriteLine("do some more work");
}
}
我说得对,这会导致“testList”不仅在“过滤”两个项目重复两次,但实际上该项目?因此,考虑到“testList”是一个包含10000个项目的大列表,“过滤”将其减少到10个项目,将“过滤”列表(也就是使用var并在末尾附加ToList())会更加巧妙。
编辑: 这是我在这里问过的最尴尬的问题。我知道迭代一个IQueryable会很糟糕,因为这会导致从数据库中两次提取数据。但是我在内存列表中并不完全确定。我想删除的问题,如果我能;-)使用下面的构造avaialble
是的,我知道。但问题是。DoSomeWork()和DoSomeMoreWork()会导致迭代大列表,还是只迭代子集。 – Christoph
@Christoph - 现在编辑回答..... –
更好使用.ToArray ToList用于此用途:数组的效率更高一些,但最重要的是,它们不允许添加/删除,避免不必要的灵活性(从而避免混淆和错误)。 –