gpt4 book ai didi

LINQ:使用 IEnumerable.Count() 或 IList.Count 以获得更好的性能

转载 作者:行者123 更新时间:2023-12-05 01:38:05 25 4
gpt4 key购买 nike

基于以下代码:

 var grouped = filters.GroupBy(p => p.PropertyName);
int numOfRowElements = grouped.Count();
foreach (IGrouping<string, PropertyFilter> filter in grouped)
{


foreach (var propertyFilter in filter)
{
// do something
}

}

where 过滤列表,我的理解是调用 IEnumerable.Count() 强制执行查询。这次执行的结果是存储在分组变量中,然后在 foreach 循环中使用,还是 foreach 循环强制再次执行查询?改为这样做会更好吗?
 var grouped = filters.GroupBy(p => p.PropertyName).ToList();
int numOfRowElements = grouped.Count;
foreach (IGrouping<string, PropertyFilter> filter in grouped)
{


foreach (var propertyFilter in filter)
{
// do something
}

}

TIA。

最佳答案

如果底层数据源是 IList<T> , Enumerable.Count()将调用 .Count属性作为优化,因此没有*性能损失。如果不是,将强制进行枚举。仔细考虑这一点。

var someList = new List<int>(); 
var count = someList.Count(); // will use .Count property
var count = someList.OrderBy(x => x).Count(); // will force enumeration

在这个例子中,我只是在第二个语句中获取列表的计数。在第三个中,我对列表进行排序,然后获取计数。对列表进行排序返回一个序列,而不是一个列表。因此, Count()方法不适用于 IList<T> ,但是一个 IEnumerable<T> .在这种情况下,必须枚举查询以获取结果,并将产生随之而来的任何成本(在这种情况下,排序)。

鉴于此,在您的第一个代码段中,您将枚举您的查询两次。一次获得计数,一次在 foreach 中。这将执行所有逻辑以对数据进行两次分组。您的第二个示例将只执行一次分组操作,同时显然会迭代 foreach 中的结果列表,这应该比第二次执行分组操作成本更低。 (您是否可以衡量节省将完全取决于原始列表中数据的大小和/或来源。如有疑问,请对其进行分析。)

*间接层可能会有一个小的测量惩罚,如果您认为这是一个真正的瓶颈,则必须对此进行分析。但是想想 Count()方法如
if (sequence is IList<T>) 
{
return ((IList<T>)sequence).Count
}
else
{
/* perform enumeration */;
}

关于LINQ:使用 IEnumerable.Count() 或 IList.Count 以获得更好的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7664049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com