如何比较两个List <String>彼此?

假设有

List<string> a1 = new List<string>(); List<string> a2 = new List<string>(); 

有没有办法做到这一点?

 if (a1 == a2) { } 

如果要检查列表中的元素是否相同并且顺序相同,则可以使用SequenceEqual

 if (a1.SequenceEqual(a2)) 

看到它在线工作: ideone

我发现SequenceEqual不是比较两个string列表最有效的方法(最初来自http://www.dotnetperls.com/sequenceequal )。

我想自己testing这个,所以我创build了两个方法:

  /// <summary> /// Compares two string lists using LINQ's SequenceEqual. /// </summary> public bool CompareLists1(List<string> list1, List<string> list2) { return list1.SequenceEqual(list2); } /// <summary> /// Compares two string lists using a loop. /// </summary> public bool CompareLists2(List<string> list1, List<string> list2) { if (list1.Count != list2.Count) return false; for (int i = 0; i < list1.Count; i++) { if (list1[i] != list2[i]) return false; } return true; } 

第二种方法是我遇到的一些代码,并想知道它是否可以被重构为“易于阅读”。 (也想知道LINQ优化是否会更快。)

事实certificate,有两个包含32kstring的列表,超过100个执行:

  • 方法1平均需要6761.8个滴答
  • 方法2平均需要3268.4个滴答

为了简洁,性能和代码的可读性,我通常更喜欢LINQ。 但在这种情况下,我认为基于循环的方法是首选。

编辑:

我重新编译使用优化的代码,并运行testing1000次迭代。 结果仍然有利于循环(甚至更多):

  • 方法1平均需要4227.2个蜱
  • 方法2平均需要1831.9个蜱

testing使用Visual Studio 2010,Core i7-920上的C#.NET 4客户端configuration文件

你也可以使用Except (产生两个序列的差异)来检查是否有差异:

 IEnumerable<string> difference = a1.Except(a2); if(!difference.Any()){} 
  private static bool CompareDictionaries(IDictionary<string, IEnumerable<string>> dict1, IDictionary<string, IEnumerable<string>> dict2) { if (dict1.Count != dict2.Count) { return false; } var keyDiff = dict1.Keys.Except(dict2.Keys); if (keyDiff.Any()) { return false; } return (from key in dict1.Keys let value1 = dict1[key] let value2 = dict2[key] select value1.Except(value2)).All(diffInValues => !diffInValues.Any()); } 

您可以通过以下方式查看列表

 List<string> FilteredList = new List<string>(); //Comparing the two lists and gettings common elements. FilteredList = a1.Intersect(a2, StringComparer.OrdinalIgnoreCase);