2017-08-09 116 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