我正在查看通用列表,以根据某个参数查找项目.
总的来说,什么是最好和最快的实施?
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";});
难道他们都不是在~O(N)中运行?这里最好的做法是什么?
此致,乔纳森
您绝对应该使用该FindAll
方法或等效的LINQ方法.另外,如果可以,请考虑使用更简洁的lambda而不是您的委托(需要C#3.0):
var list = new List(); var newList = list.FindAll(s => s.Equals("match"));
我会在这种情况下使用该FindAll
方法,因为它更简洁,而且IMO具有更易读的可读性.
你是正确的,他们是非常要既为O执行(N)时,虽然foreach
声明 应被稍微快给它不具有执行委托调用(委托承担,而不是直接调用方法略有开销) .
我必须强调这种差异是多么微不足道,除非你在庞大的名单上做大量的操作,否则它很可能永远不会有所作为.
与往常一样,测试以查看瓶颈在哪里并采取适当的行动.
乔纳森,
您可以在Linq To Action的第5章(性能考虑因素)中找到一个很好的答案.
它们为每次执行约50次的搜索测量a,并且每周期得出foreach = 68ms/List.FindAll =每周期62ms.真的,创建测试并亲眼看看可能符合您的利益.