c# 不论顺序,求两个集合的值是否一样

.net环境在3.5以上才有IEnumerable<T>.Except的方法。

主要的思路是用求差集来处理。

求差集Except方法不能完全处理我想要的这种需求。

例如:

List<int> aa = new List<int>() { 0, 1, 2, 3, 4, 5 };
List<int> bb = new List<int>() { 6, 5, 4, 3, 2, 1, 0 };
List<int> cc = new List<int>() { 7, 8, 9, 10, 0 };
var x = aa.Except(bb).ToList();
var y = bb.Except(aa).ToList();
var z = aa.Except(cc).ToList();

//可以看到x为空集合,Count为0;而y的集合里面只有一个元素6;z集合里面有1, 2, 3, 4, 5五个元素。

这里的aa和bb,cc明显不一样,不难推出Except的后台运算逻辑是有一个原始集合,和一个类比集合的概念。在原始集合的基础上,计算类比集合和原始集合的共有元素,然后Except运算在原始集合的基础上减去这些共有元素,得到剩余元素。

原理上大概是这样。

要实现本文最原始的诉求,我们可以在Except的基础上增加一个数量的比较

public static bool ListEquals<T>(this IEnumerable<T> one, IEnumerable<T> another)
{
    if (one.Count() != another.Count()) return false;
    return (one.Except(another)).Count() == 0;
}

这是我拿来用的扩展方法。

如有不足,请补充。

原文地址:https://www.cnblogs.com/icyJ/p/IEnumerable_Except.html