我正在查看通用列表,以根据某个参数查找项目.
总的来说,什么是最好和最快的实施?
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)
List.FindAll 是 O(n) 并将搜索整个列表。
如果您想使用 foreach 运行您自己的迭代器,我建议您使用 yield 语句,并在可能的情况下返回 IEnumerable。这样,如果您最终只需要集合中的一个元素,它会更快(因为您可以在不耗尽整个集合的情况下停止调用者)。
否则,坚持使用 BCL 界面。
乔纳森,
您可以在Linq To Action的第5章(性能考虑因素)中找到一个很好的答案.
它们为每次执行约50次的搜索测量a,并且每周期得出foreach = 68ms/List.FindAll =每周期62ms.真的,创建测试并亲眼看看可能符合您的利益.
归档时间: |
|
查看次数: |
71673 次 |
最近记录: |