2017-08-09 225 views
2

我相信这与this类似,但我无法应用相同的解决方案。从列表中删除基于特定列的重复行

我有几个列的列表:

public struct InfoForGraph 
    { 
     public float a{ get; set; } 
     public double b{ get; set; } 
     public double c { get; set; } 
     public double d { get; set; } 
     public double e { get; set; } 
     public double f { get; set; } 
     public double g { get; set; } 
     public double h { get; set; } 
     public double i { get; set; } 
     public double j { get; set; } 
    } 

我想删除从这个名单中的重复行,但只有当特定字段匹配。如果我对整个桌子做了区分,这些线条不会被删除。另外,我不在乎重复的行,我只想保留其中的一个。

输入:

2.67|1.84|420|400|1608039|808|3117|1|2|3|4 
2.68|1.84|420|401|1608039|808|3269|1|2|3|4 

输出预计:

2.67|1.84|420|400|1608039|808|3117|1|2|3|4 

所以,如果列1,2,5,6,8,9,10具有相同的价值,我应该只保留首先返回(删除第二,第三,所有这些字段匹配。)

任何想法?

回答

4

为简单起见,我缩小了您的条件,以表示两个对象相等,如果InfoForGraph.bInfoForGraph.c相等。你明白了,然后根据你的喜好改变你的比较器。

public class InfoComparer : IEqualityComparer<InfoForGraph> 
{ 
    public bool Equals(InfoForGraph x, InfoForGraph y) 
    { 
     if (x.b == y.b && x.c == y.c) 
      return true; 
     else 
      return false; 
    } 

    public int GetHashCode(InfoForGraph obj) 
    { 
     unchecked 
     { 
      int hash = 17; 
      hash = hash * 23 + obj.b.GetHashCode(); 
      hash = hash * 23 + obj.c.GetHashCode(); 
      return hash; 
     } 
    } 
} 

然后打电话给Distinct()就可以了。

var unique = list.Distinct(new InfoComparer()); 
+0

我应该提到,为了完整起见,你应该检查'GetHashCode()'和'Equals()'中的空对象和其他类似的异常/错误。 – Sach

+0

是不是两个应该相等的对象会得到不同的哈希码?例如:{b = 1,c = 2}和{b = 1,c = 3} –

+0

@MaorVeitsman我简化了OP的条件,所以在我的例子中两个对象是相等的,如果'Obj1.b == Obj2.b && Obj1 .c == Obj2.c'。所以在这些条件下,您的示例对象并不相同。 – Sach