我知道这个问题已经问过很多次了,但我看不出有什么可行的方法。我正在阅读一个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();