C# 通用列表FindAll()与foreach

C# 通用列表FindAll()与foreach,c#,.net,generics,C#,.net,Generics,我正在查看一个通用列表,以查找基于某个参数的项 一般来说,什么是最好、最快的实施方式? 1.循环浏览列表中的每个项目,并将每个匹配项保存到新列表中,然后返回该列表 foreach(string s in list) { if(s == "match") { newList.Add(s); } } return newList; 或 2.使用FindAll方法并向其传递委托 newList = list.FindAll(delegate(string

我正在查看一个通用列表,以查找基于某个参数的项

一般来说,什么是最好、最快的实施方式?
1.循环浏览列表中的每个项目,并将每个匹配项保存到新列表中,然后返回该列表

foreach(string s in list)
{ 
    if(s == "match")
    {
       newList.Add(s);
    }
} 

return newList;

2.使用FindAll方法并向其传递委托

newList = list.FindAll(delegate(string s){return s == "match";});
他们不是都跑了吗?这里的最佳做法是什么

问候,, Jonathan

在本例中,我将使用,因为它更简洁,而且IMO更易于阅读

您是对的,它们几乎都将在O(N)时间内执行,尽管由于不必执行委托调用(与直接调用方法相比,委托会产生轻微的开销),因此应该稍微快一点

我必须强调,这种差异是多么微不足道,除非你在一个庞大的列表上做大量的操作,否则它很可能永远不会产生影响

像往常一样,测试瓶颈在哪里,并采取适当的行动。

List.FindAll为O(n),将搜索整个列表

如果您想使用foreach运行自己的迭代器,我建议使用yield语句,并在可能的情况下返回IEnumerable。这样,如果您最终只需要集合中的一个元素,则会更快(因为您可以在不耗尽整个集合的情况下停止调用方)


否则,请坚持使用BCL接口。

任何性能差异都将非常小。为了清晰起见,我建议使用FindAll,或者,如果可能的话,可以列举。我更喜欢使用可枚举方法,因为它允许在重构代码时具有更大的灵活性(您不需要依赖于
List

您可以在的第5章(性能注意事项)中找到一个很好的答案


他们为每次执行大约50次的搜索测量一个值,得出foreach=68ms/周期/List.FindAll=62ms/周期。实际上,您可能对自己创建一个测试感兴趣。

您肯定应该使用
FindAll
方法或等效的LINQ方法。此外,如果你可以(如果需要C 3),使用更简洁的lambda代替你的代表:

var list=newlist();
var newList=list.FindAll(s=>s.Equals(“匹配”);

是的,两种实现都是O(n)。他们需要查看列表中的每个元素以找到所有匹配项。在可读性方面,我也更喜欢FindAll。有关性能考虑,请参阅(第5.3章)。如果您使用的是C#3.0,那么还可以应用lambda表达式。但这只是锦上添花:

var newList = aList.FindAll(s => s == "match");
我是兰博达斯的

List<String> newList = list.FindAll(s => s.Equals("match"));
List newList=List.FindAll(s=>s.Equals(“匹配”);
除非C#团队改进了
LINQ
FindAll
的性能,否则下面的文章似乎建议
for
foreach
在对象枚举方面优于
LINQ
FindAll

这篇文章可以追溯到2009年3月,就在这篇文章最初被问到之前

List<String> newList = list.FindAll(s => s.Equals("match"));