获得特定表的独特组合?

时间:2011-06-27 14:18:45

标签: 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最轻松地完成这项工作?

2 个答案:

答案 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())