我多次问过这个问题,但是看不到有用的东西。 我正在读取一个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);
}
对我有用的是
循环通过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);
}
}
有更好的方法吗?
答案 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();