2011-04-05 98 views
1

我知道這是很多次,但看不到有效的東西。 我正在閱讀一個csv文件,然後必須根據其中一列「CustomerID」刪除重複的行。 基本上,CSV文件可以有多個具有相同customerID的行。使用linq刪除重複項

我需要刪除重複項。

//DOES NOT WORK 
    var finalCustomerList = csvCustomerList.Distinct().ToList(); 

    I have also tried this extension method //DOES NOT WORK 
    public static IEnumerable<t> RemoveDuplicates<t>(this IEnumerable<t> items) 
     { 
     return new HashSet<t>(items); 
     } 

我什麼工作是

  • 我讀的CSV文件導入一個csvCustomerList
  • 遍歷csvCustomerList,檢查是否 customerExists如果它並不我添加 它。

    foreach (var csvCustomer in csvCustomerList) 
    { 
        var Customer = new customer(); 
        customer.CustomerID = csvCustomer.CustomerID; 
        customer.Name = csvCustomer.Name; 
        //etc..... 
    
        var exists = finalCustomerList.Exists(x => x.CustomerID == csvCustomer.CustomerID); 
        if (!exists) 
        { 
         finalCustomerList.Add(customer); 
        } 
    } 
    

    有沒有更好的方法來做到這一點?

回答

4

對於Distinct與非標準平等的檢查工作,你需要讓你的customer類實現IEquatable<T>。在Equals方法中,只需比較客戶的ID,而不是別的。
作爲替代方案,您可以使用the overload of Distinct that requires an IEqualityComparer<T>並創建一個類來實現customer的該接口。像那樣,你不需要改變customer類。
或者您可以按照其他答案的建議使用Morelinq。

+0

感謝,使sense.However不能修改類 – user9969 2011-04-05 08:37:14

+0

@ user231465:我更新我的回答,請檢查。 – 2011-04-05 08:42:15

3

對於一個簡單的解決方案,請查看Jon Skeet等人的Morelinq

它有一個DistinctBy運算符,您可以在任何字段執行不同的操作。所以,你可以這樣做:

var finalCustomerList = csvCustomerList.DistinctBy(c => c.customerID).ToList(); 
+0

謝謝,這將工作得很好。不確定我被允許參考另一個第三方庫 – user9969 2011-04-05 14:38:44

+0

@ user231465 - 然後看看源代碼並假裝自己寫了它。 http://code.google.com/p/morelinq/source/browse/trunk/MoreLinq/DistinctBy.cs ;-)(當然只是開玩笑......) – 2011-04-05 14:47:24

+0

lol.I永遠不會做這樣的事:) – user9969 2011-04-09 14:33:39