【问题标题】:Equality between two IEnumerable<IEnumerable<int>> objects两个 IEnumerable<IEnumerable<int>> 对象之间的相等性
【发布时间】:2013-06-10 05:05:52
【问题描述】:

我不认为 SequenceEqual 在两者之间起作用,因为“中间”元素 (IEnumerable&lt;int&gt;) 没有使用 SequenceEqual

oneThingy.SequenceEqual(twoThingy)

没有在中间元素上使用String.Join,有没有办法获得平等?

【问题讨论】:

    标签: c# ienumerable sequence equality


    【解决方案1】:

    SequenceEqual 使用Equals 进行测试;要使用SequenceEquals,您需要自己实现它。尝试使用带有序列等于的Zip 运算符。

    // example
    var first = Enumerable.Range(1, 10).Select(i => Enumerable.Range(1, i));
    var second = Enumerable.Range(1, 10).Select(i => Enumerable.Range(1, i));
    
    bool nestedSequencesEqual = 
        // test if each sequence index is equal        
        first.Zip(second, (f, s) => f.SequenceEqual(s))
        // ensure all like sequences are equal
        .All(b => b);
    // returns true
    

    【讨论】:

      【解决方案2】:

      @BleuM937 回答 +1。
      作为另一种方法,您可以将SequenceEqual 重载与相等比较器一起使用:

      IEnumerable<IEnumerable<int>> one = new IEnumerable<int>[] { new int[] { 1 }, new int[] { 1, 2, 3 } };
      IEnumerable<IEnumerable<int>> two = new IEnumerable<int>[] { new int[] { 1 }, new int[] { 1, 2, 3 } };
      
      bool nestedSequencesEqual = one.SequenceEqual(two, new SequencesComparer<int>());
      
      class SequencesComparer<T> : IEqualityComparer<IEnumerable<T>> {
          public bool Equals(IEnumerable<T> x, IEnumerable<T> y) {
              return x.SequenceEqual(y);
          }
          public int GetHashCode(IEnumerable<T> obj) {
              return obj.GetHashCode();
          }
      }
      

      【讨论】:

      • 您的哈希实现已损坏。 GetHashCode 应该反映 Equals 的实现。使用您的代码,可以找到两个具有相同 SequenceEquals 但哈希码不同的集合。不应该发生。
      【解决方案3】:

      以下代码对我有用...

      public class IntList : List<int>, IEquatable<IntList>
      {
          public bool Equals(IntList other)
          {
              return this.SequenceEqual(other);
          }
      }
      
      void Main()
      {
          List<IntList> list1 = new List<IntList>(2);
          List<IntList> list2 = new List<IntList>(2);
      
          var list11 = new IntList() {1, 2, 3};
          list1.Add(list11);
      
          var list21 = new IntList() {1, 2, 3};
          list2.Add(list21);
      
      
          var result = list1.SequenceEqual(list2);
          Console.WriteLine(result);
      }
      

      参考:http://msdn.microsoft.com/en-us/library/bb348567(v=vs.100).aspx

      【讨论】:

        猜你喜欢
        • 2010-10-30
        • 1970-01-01
        • 2011-06-25
        • 2010-09-24
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        相关资源
        最近更新 更多