foreach与Where()。Select()的性能

时间:2018-10-09 14:48:44

标签: c# performance foreach


这个问题是关于性能方面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

有人可以提供帮助并提供改善建议吗?

1 个答案:

答案 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();

与循环或自定义委托相比,可能更容易理解。