2011-05-12 45 views
0

我有這樣一個名單,C#刪除重複的邏輯

COL1 COL2 COL3 
    ---- ---- ----- 
    AA AB Some text 
    AA AC Some text 
    AA AB Some text 
    AB AB Some text 
    AB AC Some text 
    AA AC Some text 

我期待在C#中(也許在+ LINQ)一個快速,高效的邏輯去除這兩列重複(COL1,COL2) (同樣喜歡刪除重複在Excel)

最終結果應該是

AA AB Some text 
AA AC Some text 
AB AB Some text 
AB AC Some text 

請指點

+0

您需要顯示列如何以對象的形式存儲在內存中。很可能你會使用LINQ Distinct擴展。 – pickypg 2011-05-12 04:02:08

+1

這些數據的數據結構是什麼?兩個清單?如果是這樣,LINQ中的'.Distinct()'擴展將成爲你的方法。 – Tejs 2011-05-12 04:02:19

+0

我如何.Distinct()只適用於COL1,COL2? – kakopappa 2011-05-12 04:04:17

回答

3

使用@Zerkms給出的建議。例如,假設您的對象類型爲MyRow:

public class MyRowComparer : IEqualityComparer<MyRow> 
{ 
    public override bool Equals(MyRow r1, MyRow r2) 
    { 
     // adjust the logic as per your need e.g. case-insensitive etc 
     return r1.Col1 == r2.Col1 && r1.Col2 == r2.Col2; 
    } 

    public override int GetHashCode(MyRow r) 
    { 
     // TODO: add null check etc 
     return r.Col1.GetHashCode()^r.Col2.GetHashCode() 
    } 
} 

IEnumerable<MyRow> myList = ...; 
... 
myList.Distinct(new MyRowComparer()); 
+0

+1。 zerkms應該已經提出了他的評論一個答案;) – 2011-05-12 04:19:41

+1

雖然這對於OP詢問的問題沒有問題(您沒有太多的選擇),但您可能要提醒用戶不要在您的哈希碼中使用可變屬性。這[Eric Lippert的文章](http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx?PageIndex=2)詳細介紹了這一點 – 2011-05-12 04:39:13

+0

@康拉德,謝謝你放棄這個免責聲明!雖然,它可能不適用於這種情況。只要這些對象在使用MyRowComparer實例的操作中不會發生變異,那麼可以使用這種實現。我相信,在大多數用例中,這是真實的(但當然,你永遠不知道)。 – VinayC 2011-05-12 08:08:54

1

This i the solution by Distinct

var query = (from record in MyList select record).Distinct(); 
+2

'(從MyList選擇記錄中的記錄)'==='MyList' – porges 2011-05-12 04:16:02

+0

根據他在哪裏獲取數據,默認比較器可能會檢查所有列。他只關心前兩欄中的重複內容。 – 2011-05-12 04:20:51

+0

您可以使用group by來做到這一點。 – Saleh 2011-05-12 04:51:50