表1:
ValueA
ValueB
ValueC
示例数据:
1,2,3
1,2,4
1,2,4
1,2,4
1,5,6
1,5,6
我想根据这三个值获取唯一的行:
1,2,3
1,2,4
1,5,6
如何使用linq最轻松地完成这项工作?
答案 0 :(得分:1)
编写自己的IEqualityComparer
并在代表行的对象集合上使用Enumerable.Distinct
。
有点像(抱歉,没有在编译器中测试):
class Foo {
public int ValueA { get; set; }
public int ValueB { get; set; }
public int ValueC { get; set; }
}
class FooEqualityComparer : IEqualityComparer<Foo> {
public bool Equals(Foo x, Foo y) {
if(Object.ReferenceeEquals(x, y)) { return true; }
if(x == null || y == null) { return false; }
return x.ValueA == y.ValueA &&
x.ValueB == y.ValueB &&
x.ValueC == y.ValueC;
}
public int GetHashCode(Foo obj) {
if(obj == null) { return 0; }
unchecked {
int hashCode = 17;
hashCode = hashCode * 23 + obj.ValueA.GetHashCode();
hashCode = hashCode * 23 + obj.ValueB.GetHashCode();
hashCode = hashCode * 23 + obj.ValueC.GetHashCode();
return hashCode;
}
}
}
然后:
IEnumerable<Foo> foos = // some foos;
var distinct = foos.Distinct(new FooEqualityComparer());
答案 1 :(得分:0)
您可以将.Distinct()
与您自己的比较器类
class MyComparer : IEqualityComparer<YourRowClass>
然后像
一样使用它yourList.Distinct(MyComparer())