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"));