0
表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最容易做?
表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最容易做?
編寫自己的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());
你可以使用.Distinct()
用自己的比較器類
class MyComparer : IEqualityComparer<YourRowClass>
然後像
yourList.Distinct(MyComparer())