LINQ:使用IEnumerable.Count()或IList.Count可获得更好的性能
基于以下代码:LINQ:使用IEnumerable.Count()或IList.Count可获得更好的性能,linq,deferred-execution,Linq,Deferred Execution,基于以下代码: var grouped = filters.GroupBy(p => p.PropertyName); int numOfRowElements = grouped.Count(); foreach (IGrouping<string, PropertyFilter> filter in grouped) { foreach (var pro
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
}
}
var group=filters.GroupBy(p=>p.PropertyName);
int numorrowElements=grouped.Count();
foreach(分组中的I分组筛选器)
{
foreach(过滤器中的var propertyFilter)
{
//做点什么
}
}
在筛选列表时,我的理解是调用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
}
}
var group=filters.GroupBy(p=>p.PropertyName.ToList();
int numorrowElements=grouped.Count;
foreach(分组中的I分组筛选器)
{
foreach(过滤器中的var propertyFilter)
{
//做点什么
}
}
TIA.如果基础数据源是IList
,可枚举.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
谢谢你的全面回复。原始列表中的数据大小不会很大,但此操作将在UI线程上大量执行。
if (sequence is IList<T>)
{
return ((IList<T>)sequence).Count
}
else
{
/* perform enumeration */;
}