这个问题是关于性能方面foreach和Linq方法之间的比较。
下面提供的代码只是我目前的一个例子。
在foreach循环上使用.Where()。Select()是否有优势(从性能的角度来看)?
我有这个C#块,我想在这里提高性能:
var resultList = new List<MyItemWrapper>();
foreach (var key in KeysCollection)
{
if (SomeCondition(key))
{
var anotherKey = CreateAnotherKey(key);
if (AnotherCondition(anotherKey))
{
resultList.Add(new MyItemWrapper { Id = key });
}
}
}
我尝试使用Where()。Select(),还尝试使用AsPArallel(),但性能没有改善。相反,我看到性能变得最差。
var resultList = KeysCollection
.Where(key =>
{
if (!SomeCondition(key))
return false;
var anotherKey = CreateAnotherKey(key);
return AnotherCondition(anotherKey);
})
.Select(key => new MyItemWrapper { Id = key })
.ToList();
注意:
SomeCondition()
和AnotherCondition()
应该被视为黑盒。 resultList
应该是IList
。KeysCollection
的类型为ICollection
有人可以提供帮助并提供改善建议吗?
答案 0 :(得分:3)
Linq并非旨在提高性能。它旨在提高编码效率。在某些情况下,它可能比 bad 循环的性能更好(例如,当您寻找某项商品的存在时,Any
将在找到某项商品时停止,但是会出现不良的循环可能会继续循环),但通常不会提高性能。
因此,请使用您更了解的内容(恕我直言,您所使用的委托在哪里很难理解),并使用Linq来提高的可读性。
如果已识别一个性能问题,请使用性能分析器来确定将最多时间花费在哪里。如果Linq方法实际上是瓶颈,我会感到惊讶。
也就是说,您还可以 这样构造查询:
var reslutList = KeysCollection.Where(key => SomeCondition(key))
.Where(key => AnotherCondition(CreateAnotherKey(key)))
.Select(key => new MyItemWrapper { Id = key })
.ToList();
与循环或自定义委托相比,可能更容易理解。