ToList()或不ToList()?

Lia*_*iam 5 c# linq performance ienumerable tolist

给定内存(不是LINQ to SQL)类列表:

List<MyClass> myItems = /*lots and lots of items*/;
Run Code Online (Sandbox Code Playgroud)

我正在使用一个GroupBy()声明进行分组:

myItems.GroupBy(g => g.Ref)
Run Code Online (Sandbox Code Playgroud)

然后立即消费foreach循环是否有任何区别呼吁.ToList()"组"或我应该只使用IEnumerable.

完全代码示例:

ToList()

List<List<MyClass>> groupedItemsA = new List<List<MyClass>>();
List<List<MyClass>> groupedItemsB = new List<List<MyClass>>();

List<MyClass> myItems = /*lots and lots of items*/;
List<IGrouping<string, MyClass>> groupedItems = myItems.GroupBy(g => g.Ref).ToList();
foreach(IGrouping<string, MyClass> item in groupedItems)
{
  if (/*check something*/)
  {
     groupedItemsA.Add(item.ToList());
  }
  else
  {
    groupedItemsB.Add(item.ToList());
  }
}
Run Code Online (Sandbox Code Playgroud)

要么

运用 IEnumerable

List<List<MyClass>> groupedItemsA = new List<List<MyClass>>();
List<List<MyClass>> groupedItemsB = new List<List<MyClass>>();


List<MyClass> myItems = /*lots and lots of items*/;
IEnumerable<IGrouping<string, MyClass>> groupedItems = myItems.GroupBy(g => g.Ref);
foreach(IGrouping<string, MyClass> item in groupedItems)
{
  if (/*check something*/)
  {
     groupedItemsA.Add(item.ToList());
  }
  else
  {
    groupedItemsB.Add(item.ToList());
  }
}
Run Code Online (Sandbox Code Playgroud)

这些"引擎盖"的执行计划有什么不同吗?这些中的任何一个会更有效还是不重要?

在此之后我没有使用该groupedItems列表.

jak*_*ket 6

是的,有区别,可能很重要.

ToList()将迭代并将每个迭代项追加到新列表中.这具有创建消耗内存的临时列表的效果.

有时你可能想要记忆惩罚,特别是如果你打算多次迭代列表并且原始列表不在内存中.

在您的特定示例中使用ToList()实际上最终迭代两次 - 一次构建列表,第二次在foreach中.根据列表的大小和您的应用程序,这可能是也可能不是一个问题.

  • 这是ToList()的隐含行为.它需要强制评估查询以构建列表 - 没有其他办法解决它.请参阅https://msdn.microsoft.com/en-us/library/vstudio/bb342261(v=vs.100).aspx的备注部分. (2认同)