因为这个
(vb.net)
Dim test As New List(Of Integer())
test.Add(New Integer() {1, 2, 3})
test.Add(New Integer() {1, 3, 3})
test.Add(New Integer() {3, 2, 3})
test.Add(New Integer() {1, 1, 3})
test.Add(New Integer() {1, 2, 3})
Dim a = test.Distinct
(C#)
List<int[]> test = new List<int[]>();
test.Add(new int[] { 1, 2, 3 });
test.Add(new int[] { 1, 3, 3 });
test.Add(new int[] { 3, 2, 3 });
test.Add(new int[] { 1, 1, 3 });
test.Add(new int[] { 1, 2, 3 });
var a = test.Distinct();
不起作用,你会怎么做?
答案 0 :(得分:6)
在这种情况下,您必须为Distinct
提供自定义的Equality比较器 - 否则您要比较引用,这是初步尝试:
class SequenceComparer<T,U> : IEqualityComparer<T> where T: IEnumerable<U>
{
public bool Equals(T x, T y)
{
return Enumerable.SequenceEqual(x, y);
}
public int GetHashCode(T obj)
{
int hash = 19;
foreach (var item in obj)
{
hash = hash * 31 + item.GetHashCode();
}
return hash;
}
}
现在,您可以在致电Distinct()
时使用此功能:
var results = test.Distinct(new SequenceComparer<int[],int>())
.ToList();
答案 1 :(得分:3)
使用您可以提供IEqualityComparer
的{{3}}并将其实施以比较两个列表。
最小化实施:
class ListComparer<T> : IEqualityComparer<List<T>> {
public bool Equals(List<T> a, List<T> b) {
if (a.Count != b.Count)
return false;
for (int i = 0; i < a.Count; i++)
if (! a[i].Equals(b[i])
return false;
return true;
}
public int GetHashCode(List<T> a) {
int ret = 11;
unchecked {
foreach (var x in a)
ret = ret * 17 + x.GetHashCode();
}
return ret;
}
}
但是一个真正的实现应该有第二个构造函数接受IEqualityComparer<T>
(以及其他东西,以便它们可以嵌套在嵌套列表上使用)。