C#:你如何检查列表是否具有相同的大小和相同的元素?

有两个字符串列表

List A; List B; 

您建议检查A.Count == B.Count以及B中A的每个元素的最短代码是什么,反之亦然:每个B都在A中(A项和B项可能有不同的顺序)。

如果您不需要担心重复:

 bool equal = new HashSet(A).SetEquals(B); 

如果你担心重复,那就会变得更加尴尬。 这会有效,但速度相对较慢:

 bool equal = A.OrderBy(x => x).SequenceEquals(B.OrderBy(x => x)); 

当然,您可以通过首先检查计数来使两个选项更有效,这是一个简单的表达式。 例如:

 bool equal = (A.Count == B.Count) && new HashSet(A).SetEquals(B); 

…但是你要的是最短的代码:)

 A.Count == B.Count && new HashSet(A).SetEquals(B); 

如果重复的不同频率是一个问题,请查看此问题 。

如果在两个列表上调用Enumerable.Except() ,那将返回一个IEnumerable其中包含一个列表中的所有元素,但不包含另一个列表中的所有元素。 如果计数为0,那么您就知道这两个列表是相同的。

 var result = A.Count == B.Count && A.Where(y => B.Contains(y)).Count() == A.Count; 

也许?

一个简单的循环怎么样?

 private bool IsEqualLists(List A, List B) { for(int i = 0; i < A.Count; i++) { if(i < B.Count - 1) { return false; } else { if(!String.Equals(A[i], B[i]) { return false; } } } return true; } 

如果你不关心重复,或者你担心重复但不过分担心性能微观优化,那么Jon的答案中的各种技术绝对是可行的方法。

如果您担心重复性能,那么类似这种扩展方法应该可以解决问题,尽管它确实不符合您的“最短代码”标准!

 bool hasSameElements = A.HasSameElements(B); // ... public static bool HasSameElements(this IList a, IList b) { if (a == b) return true; if ((a == null) || (b == null)) return false; if (a.Count != b.Count) return false; var dict = new Dictionary(a.Count); foreach (string s in a) { int count; dict.TryGetValue(s, out count); dict[s] = count + 1; } foreach (string s in b) { int count; dict.TryGetValue(s, out count); if (count < 1) return false; dict[s] = count - 1; } return dict.All(kvp => kvp.Value == 0); } 

(请注意,如果两个序列都为null ,则此方法将返回true 。如果这不是所需的行为,那么添加额外的null检查就很容易了。)