这里有两个字符串列表
List<string> A;
List<string> B;
您会建议编写多短的代码来检查 A.Count == B.Count 以及 A 中的每个元素是否在 B 中, 反之亦然:即 A 和 B 中的每个元素都相等(A 和 B 的顺序可能不同)。
如果您不必担心重复:
bool equal = new HashSet<string>(A).SetEquals(B);
如果你关心重复问题,那会变得稍微麻烦一些。以下代码可以解决,但速度相对较慢:
bool equal = A.OrderBy(x => x).SequenceEquals(B.OrderBy(x => x));
当然,您可以通过首先检查计数来使这两个选项更有效率,这是一个简单的表达式。例如:
bool equal = (A.Count == B.Count) && new HashSet<string>(A).SetEquals(B);
...但你要求最短的代码 :)
IEnumerable<string>
,其中包含所有存在于一个列表中但不存在于另一个列表中的元素。如果其计数为0,则说明这两个列表相同。如果你不关心重复,或者你关心重复但并不过分关心性能微观优化,那么Jon答案中的各种技术绝对是正确的选择。
如果你既关心重复又关心性能,那么像这样的扩展方法应该能解决问题,虽然它确实不符合你的“最短代码”标准!
bool hasSameElements = A.HasSameElements(B);
// ...
public static bool HasSameElements<T>(this IList<T> a, IList<T> b)
{
if (a == b) return true;
if ((a == null) || (b == null)) return false;
if (a.Count != b.Count) return false;
var dict = new Dictionary<string, int>(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
检查。)
var result = A.Count == B.Count && A.Where(y => B.Contains(y)).Count() == A.Count;
可能吗?
一个简单的循环怎么样?
private bool IsEqualLists(List<string> A, List<string> 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;
}
SequenceEqual
也正如你所说的,更加优雅。 - LukeH
Enumerable.Distinct()
操作的是 一个 序列。您是否意思是Enumerable.Except()
? - Jon Skeet