Linq Count方法和性能

Dee*_*esh 8 linq

我在我的项目中广泛使用Linq,到目前为止性能都很好,我只有一个疑问,如果我使用Linq这样的东西

var getData = objData.where(obj => obj.isDelete ==false)
if (getData != null && getData.Count() > 0)
   foreach(xyz as obj in getdata.ToList())
   {
      //some operation
   }
Run Code Online (Sandbox Code Playgroud)

getData.Count()和getdata.ToList()对对象执行两次不同的提取吗?或者根据deffer加载概念执行getData.Count()时,不会对.ToList执行任何操作.

如果没有,那么我应该删除计数条件,它会改善性能吗?

我正在使用Enterprise Library 5.0 acessor方法从DB List中获取数据lstpack = new List();

            var accessor = _sqlDatabase.CreateSprocAccessor<PackageForClient>("PackageForClientApp", MapBuilder<PackageForClient>
                      .MapAllProperties()
                      .Build()
               );

            var Data = accessor.Execute(startdate, enddate,beinh);
            if (Data != null) //&& Data.Count() > 0 //This has been removed as it is doing an extra fetch
                lstpack = Data.ToList<PackageForClient>();
Run Code Online (Sandbox Code Playgroud)

现在返回列表

Jon*_*eet 13

我们很难确定,因为我们不知道是什么getData,但是:

  • 是的,可能他们将是完全独立的操作
  • 一般来说,使用Any()而不是Count() > 0; 它可以更高效,特别是在LINQ to Objects中
  • 呼叫ToList将是相对便宜的,当它是空的-只要做到这一点,如果你需要一个列表
  • 如果你真的不需要它在列表中,只需迭代(如果没有数据,你将永远不会进入循环体)
  • Where 永远不会返回null

换句话说,我可能写道:

foreach (Obj xyz in objData.Where(obj => !obj.isDelete))
{
   //some operation
}
Run Code Online (Sandbox Code Playgroud)