通用列表FindAll()与foreach

jon*_*n37 30 .net c# generics

我正在查看通用列表,以根据某个参数查找项目.

总的来说,什么是最好和最快的实施?
1.循环遍历列表中的每个项目,并将每个匹配保存到新列表并返回该列表

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

return newList;
Run Code Online (Sandbox Code Playgroud)

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

newList = list.FindAll(delegate(string s){return s == "match";});
Run Code Online (Sandbox Code Playgroud)

难道他们都不是在~O(N)中运行?这里最好的做法是什么?

此致,乔纳森

Egi*_*sen 46

您绝对应该使用该FindAll方法或等效的LINQ方法.另外,如果可以,请考虑使用更简洁的lambda而不是您的委托(需要C#3.0):

var list = new List<string>();
var newList = list.FindAll(s => s.Equals("match"));
Run Code Online (Sandbox Code Playgroud)


cas*_*One 9

我会在这种情况下使用该FindAll方法,因为它更简洁,而且IMO具有更易读的可读性.

你是正确的,他们是非常要既为O执行(N)时,虽然foreach声明 稍微快给它不具有执行委托调用(委托承担,而不是直接调用方法略有开销) .

我必须强调这种差异是多么微不足道,除非你在庞大的名单上做大量的操作,否则它很可能永远不会有所作为.

与往常一样,测试以查看瓶颈在哪里并采取适当的行动.


Ree*_*sey 5

List.FindAll 是 O(n) 并将搜索整个列表。

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

否则,坚持使用 BCL 界面。


mat*_*dev 5

乔纳森,

您可以在Linq To Action的第5章(性能考虑因素)中找到一个很好的答案.

它们为每次执行约50次的搜索测量a,并且每周期得出foreach = 68ms/List.FindAll =每周期62ms.真的,创建测试并亲眼看看可能符合您的利益.