使用linq删除重复项

时间:2011-04-05 07:12:47

标签: linq

我多次问过这个问题,但是看不到有用的东西。 我正在读取一个csv文件,然后我必须删除基于“CustomerID”列之一的重复行。 基本上,CSV文件可以有多行具有相同的customerID。

我需要删除重复项。

    //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);
        }
     }
    

    有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

要让Distinct使用非标准的相等性检查,您需要让您的课程customer实施IEquatable<T>。在Equals方法中,只需比较客户ID即可 作为替代方案,您可以使用the overload of Distinct that requires an IEqualityComparer<T>并创建一个实现customer接口的类。像这样,您不需要更改customer类 或者你可以按照另一个答案的建议使用Morelinq。

答案 1 :(得分:3)

如需简单的解决方案,请查看Jon Skeet和其他人的Morelinq

它有一个DistinctBy运算符,您可以在其中执行任何字段的不同操作。所以你可以这样做:

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