使用linq删除重复项

  • 本文关键字:删除 linq 使用 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);
        }

适合我的是

  • I读取CSV文件到csvCustomerList
  • 遍历csvCustomerList并检查是否有如果不存在,我添加它。

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

    有更好的方法吗?

对于Distinct工作与非标准相等性检查,您需要使您的类customer实现IEquatable<T>。在Equals方法中,只比较客户id而不比较其他内容。
作为一种替代方法,您可以使用Distinct的重载,它需要一个IEqualityComparer<T>,并创建一个为customer实现该接口的类。像这样,您不需要更改customer类。
或者你也可以按照另一个答案的建议使用Morelinq

一个简单的解决方案,看看Morelinq由Jon Skeet和其他人。

有一个DistinctBy操作符,可以对任何字段执行不同的操作。你可以这样写:

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

相关内容

  • 没有找到相关文章

最新更新