2

SequenceEqual「中間」要素 ( IEnumerable<int>) は を使用していないため、2 つの間で機能しているとは思いませんSequenceEqual

oneThingy.SequenceEqual(twoThingy)

中間要素で使用String.Joinする以外に、平等にする方法はありますか?

4

3 に答える 3

3

SequenceEqualを使用してテストしEqualsます。使用SequenceEqualsするには、自分で実装する必要があります。Zip演算子をシーケンス equals で使用してみてください。

// 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
于 2013-06-10T05:18:34.657 に答える
1

@ 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();
    }
}
于 2013-06-10T05:32:49.953 に答える
0

次のコードは私のために働く...

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

于 2013-06-10T06:22:45.590 に答える