给定内存中的,(而不是LINQ )类列表:
List<MyClass> myItems = /*lots and lots of items*/;我使用GroupBy()语句对其进行分组:
myItems.GroupBy(g => g.Ref)然后立即在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());
}
}或
使用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());
}
}这些“引擎盖下”的执行计划有什么不同吗?这两种方法中的哪一种会更有效率,还是根本不重要?
我是,而不是,在此之后使用groupedItems列表。
发布于 2015-05-01 10:15:05
是的,这是有区别的,这可能是很重要的。
ToList()将迭代每个迭代项并将其追加到一个新列表中。这样做的效果是创建一个临时列表来消耗内存。
有时,您可能想要承受内存损失,特别是如果您打算多次迭代列表,而原来的列表不在内存中。
在使用ToList()的特定示例中,实际上您最终会迭代两次--一次来构建列表,另一次在您的预测中进行迭代。取决于列表和应用程序的大小,这可能是一个问题,也可能不是一个问题。
发布于 2015-05-01 10:09:15
如果您确定只使用groupedItems一次,那么使用.ToList()有一个优点:如果有异常(例如,因为您的代码正在为计算.Ref做有趣的事情),那么异常将出现在.ToList()行中,而不是在foreach中.我不认为这是一个很大的优势(也许这是一个劣势)。
澄清:
public class MyClass
{
public string Ref
{
get
{
// sometimes I like to throw an exception!
if (DateTime.Now.Ticks % 10 == 0) throw new Exception();
return "Foo";
}
}
}请注意,您已经显式地将这个问题标记为IEnumerable,在您的示例中,myItems是一个List<>,所以当您通过实体框架/Linq从数据库读取数据到SQL时,我将不讨论执行ToList()的区别。
发布于 2015-05-01 10:08:35
有什么不同吗?
是的,.ToList()通过迭代分组集合创建了一个新列表:
method forces immediate query evaluation and returns a List that contains the query results。
这是否值得注意,应该由你来衡量。
如果只迭代分组集合一次,则.ToList()步骤是不必要的,并且相对于直接枚举GroupBy()结果要慢一些。
https://stackoverflow.com/questions/29984957
复制相似问题