2011-04-05 96 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