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 */;
}