【发布时间】:2013-06-10 05:05:52
【问题描述】:
我不认为 SequenceEqual 在两者之间起作用,因为“中间”元素 (IEnumerable<int>) 没有使用 SequenceEqual。
oneThingy.SequenceEqual(twoThingy)
没有在中间元素上使用String.Join,有没有办法获得平等?
【问题讨论】:
标签: c# ienumerable sequence equality
我不认为 SequenceEqual 在两者之间起作用,因为“中间”元素 (IEnumerable<int>) 没有使用 SequenceEqual。
oneThingy.SequenceEqual(twoThingy)
没有在中间元素上使用String.Join,有没有办法获得平等?
【问题讨论】:
标签: c# ienumerable sequence equality
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
【讨论】:
@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 但哈希码不同的集合。不应该发生。
以下代码对我有用...
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
【讨论】: