Moo*_*ght 3 c# optimization list
所有,我想知道是否有更好的方法List<T>从两个单独的List<T>s 获得匹配的值.
如果我想找到itemList<string>另一个列表中的字符串列表(一个不同的列表)中的所有项目bankList<string>(也是不同的,因此返回的列表也是不同的 - 没有重复),我将这样做的方式
List<string> matchingList = new List<string>();
foreach (string s in itemList)
if (bankList.Contains(s))
matchingList.Add(s);
Run Code Online (Sandbox Code Playgroud)
是否有更好和/或更快的方法?
扩展:我很欣赏这个问题已被回答(这是有利的),但出于兴趣,获得否定的最佳方式(即那些不 在内的项目bankList<string>)是
List<string> interList = new List<string>();
interList = itemList.Intersect(bankList).ToList<string>();
matchingList = itemList.Except(interList).ToList<string>();
Run Code Online (Sandbox Code Playgroud)
或者在这种情况下它会回到
List<string> matchingList = new List<string>();
foreach (string s in itemList)
if (!bankList.Contains(s))
matchingList.Add(s);
Run Code Online (Sandbox Code Playgroud)
我认为在这种情况下有趣的可能是后者?
jas*_*son 16
有一个更清晰的方法来做到这一点:
var matchingList = itemList.Intersect(bankList).ToList();
Run Code Online (Sandbox Code Playgroud)
而且,它会更快,因为它不会O(n^2).现在,你正在遍历bankList每个项目itemList.相反,您应该构建一个HashSetfrom itemList,然后在HashSet行走时检查包含内容bankList.这正是Enumerable.Intersect将要做的.
因此,您在两个方面都获胜:性能和可读性.
获得否定的最佳方式(即不在bankList中的那些项目)是
说啊
var except = itemList.Except(bankList).ToList();
Run Code Online (Sandbox Code Playgroud)