0
ValueA
ValueB
ValueC
例データ:
1,2,3
1,2,4
1,2,4
1,2,4
1,5,6
1,5,6
私はこれらの3つの値に基づいて一意の行を取得したい:
1,2,3
1,2,4
1,5,6
これは、LINQを使用して最も簡単に行うことができますどのように?
ValueA
ValueB
ValueC
例データ:
1,2,3
1,2,4
1,2,4
1,2,4
1,5,6
1,5,6
私はこれらの3つの値に基づいて一意の行を取得したい:
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());
あなたがあなた自身の比較演算子クラスに
class MyComparer : IEqualityComparer<YourRowClass>
を.Distinct()
を使用することができます好きなように使う
yourList.Distinct(MyComparer())