【问题标题】:Determine whether sets are equal (set composed of sets)判断集合是否相等(由集合组成的集合)
【发布时间】:2017-08-08 07:49:36
【问题描述】:

我有两个 int

的列表列表
var a = new List<IList<int>>();
var b = new List<IList<int>>();

他们每个人都有以下数据:

var a = new List<IList<int>>()
                {
                    new List<int>() { 1, 2 },
                    new List<int>() { 4, 5, 6 },
                };

var b = new List<IList<int>>()
                {
                    new List<int>() { 6, 5, 4 },
                    new List<int>() { 2, 1 },
                };

我想将ab 视为sets of sets,所以在a.Equals(b), 上它应该返回true。

如何执行我的 Equals 方法?

【问题讨论】:

  • 你可以做扩展方法。

标签: c# .net set compare equals


【解决方案1】:

假设您的支票需要不了解订单,您应该检查一下:LINQ : Determine if two sequences contains exactly the same elements

一组集合IEqualityComparer 实现可能如下所示:

public bool Equals(List<IList<int>> x, List<IList<int>> y)
{
    foreach(var innerList in x)
    {
        var innerSet = new HashSet<int>(innerList);
        var hasEquivalent = false;

        foreach(var otherInnerList in y)
        {
            hasEquivalent = innerSet.SetEquals(otherInnerList);
            if(hasEquivalent) break;
        }

        if(!hasEquivalent) return false;
    }

    return true;
}

【讨论】:

  • 请注意,我不是在比较 2 个列表,而是在比较 2 个列表列表,并且我想确定两个嵌套级别的相等性。
  • 我已经更新了解释集合集合的答案,假设每个内部集合具有相同的固定大小,并且一侧的内部集合需要在另一侧具有等价物跨度>
  • 对不起,但对于我的问题,我不能假设每个都有固定的大小。请参阅我更新的问题(数据)。它应该适用于示例中的数据。
  • 我可能表达得很糟糕。我想澄清new List&lt;int&gt;() { 1, 2 }, new List&lt;int&gt;() { 4, 5, 6 } } 不会等同于new List&lt;int&gt;() { 1, }, new List&lt;int&gt;() { 2, 4, 5, 6 }} 我的意思是说内部集合将在与它们大小相同的集合子集中寻找等价物。
【解决方案2】:

不使用 linq 检查 foreach 元素的一种方法是 首先创建一个 EqualityComparer

class ListComparer : IEqualityComparer<IList<int>>
{
    public bool Equals(IList<int> x, IList<int> y)
    {
      return  x.SequenceEqual(y);
    }

    public int GetHashCode(IList<int> obj)
    {
        throw new NotImplementedException();
    }

}

然后使用相等比较器比较两个元素

var equals=  one.SequenceEqual(two,new ListComparer());

【讨论】:

  • 请注意,我不是在比较 2 个列表,而是在比较 2 个列表列表,并且我想确定两个嵌套级别的相等性。
  • 代码会这样,它将列表一的每个元素与列表二进行比较,当比较listone和listtwo时,它将使用ListComparer与intern将listone和listtwo的元素视为列表并比较它们以及列表,也可以修改代码,以便通过更改 public bool Equals(IList x, IList y) { return x.SequenceEqual(y,new ListComparer()); }
猜你喜欢
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2018-01-03
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多