C# foreach与Where()的性能对比。选择()

C# foreach与Where()的性能对比。选择(),c#,performance,foreach,C#,Performance,Foreach,这个问题是关于从性能角度比较foreach和Linq方法的。 下面我带来的代码只是我目前拥有的一个示例 从性能角度来看,使用.Where.Select优于foreach循环是否有优势 我有这个C块,我想在这里提高性能: var resultList = new List<MyItemWrapper>(); foreach (var key in KeysCollection) { if (SomeCondition(key)) { var anothe

这个问题是关于从性能角度比较foreach和Linq方法的。 下面我带来的代码只是我目前拥有的一个示例

从性能角度来看,使用.Where.Select优于foreach循环是否有优势

我有这个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 });
        }
    }
}
注:

某些条件和另一个条件应被视为黑匣子。 返回的结果列表应该是IList。 KeyCollection的类型为ICollection
有人能帮我改进一下吗?

Linq不是为了提高性能而设计的。它旨在提高编码效率。在某些情况下,它的性能可能比坏循环更高,例如,当您查找某个项目的存在时,任何项目都会在找到该项目时停止,但坏循环可能会继续循环,但通常不会提高性能

因此,请使用您更了解的内容,因为您使用的代理更难理解,并且使用Linq来提高可读性

如果您发现了性能问题,那么请使用一个好的探查器来确定在哪里花费的时间最多。如果Linq方法实际上是一个瓶颈,我会感到惊讶

也就是说,您也可以这样构造查询:

var reslutList = KeysCollection.Where(key => SomeCondition(key))
                               .Where(key => AnotherCondition(CreateAnotherKey(key)))
                               .Select(key => new MyItemWrapper { Id = key })
                               .ToList();

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

您是否在探查器中运行代码以查看瓶颈在哪里?你在用多少把钥匙?可能是其中一个黑盒方法的慢,在这种情况下,循环构造不会产生任何影响。看起来你可以简单地使用并将结果发布到这个问题中Linq方法本质上只是调用foreach循环,你为什么认为它会表现得更好?我认为CreateAnotherKey和/或其他条件是瓶颈…谢谢大家的评论。我的主要问题是关于foreach和LINQ方法的性能。如果它们中的任何一个明显优于另一个。不是关于黑盒方法。AsParallel怎么样,它应该允许我们并行运行?为什么它没有帮助呢?我也试过了。非常感谢你清楚的回答。所以听起来是这样的:使用LINQ在性能上没有优势,但在可读性方面更大。这是正确的说法吗?但是,阿斯帕莱尔呢?它应该允许我们并行运行?为什么它没有帮助呢?我也试过了。AsParallel只帮助CPU受限的进程。如果您的进程没有与CPU挂钩,但存在其他瓶颈,如内存、I/O、网络等,那么AsParallel可能不会有帮助。
var reslutList = KeysCollection.Where(key => SomeCondition(key))
                               .Where(key => AnotherCondition(CreateAnotherKey(key)))
                               .Select(key => new MyItemWrapper { Id = key })
                               .ToList();