我有一个包含许多变量的对象,我想要一个不同的函数来比较两个变量(customerid,status)来考虑重复项,我正在使用下面的比较,但我希望选择优先级如何distinct函数将删除重复项。
有一个名为“file”的字符串变量,它将具有一个文件的名称(所有文件具有相同的扩展名),但在扩展名之前有3个不同的可能后缀(“”,“_ 0”,“TEXT”)。例如
“file_Name.txt”
“file_Name_0.txt”
“file_Name_TEXT.txt”
如果有重复,我希望“file_Name.txt”优先保留。我怎么能这样做?
class CustomerComparer : IEqualityComparer<Customer>
{
public bool Equals(Customer x, Customer y)
{
if (Object.ReferenceEquals(x, y)) return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
return x.customerid == y.customerid && x.status == y.status;
}
public int GetHashCode(Customer aprov)
{
if (Object.ReferenceEquals(aprov, null)) return 0;
int hashProductName = aprov.status == null ? 0 : aprov.status.GetHashCode();
int hashProductCode = aprov.customerid.GetHashCode();
return hashProductName ^ hashProductCode;
}
}
答案 0 :(得分:0)
我认为您可以将您的客户分组:
var filteredCustomers = new List<Customer>();
var separators = new string[] { "_", ".txt" };
foreach (var customers in allCustomers.GroupBy(c => new { Id = c.customerid, Status = c.status }))
{
Customer uniqueCustomer = customers.FirstOrDefault(c =>
{
var lastPart = c.file.Split(separators, StringSplitOptions.RemoveEmptyEntries).LastOrDefault();
if (lastPart != "TEXT" && lastPart != "0")
{
return true;
}
return false;
});
if (uniqueCustomer == null)
{
uniqueCustomer = customers.FirstOrDefault();
}
filteredCustomers.Add(uniqueCustomer);
}
此外,还可以更改寻找引物客户的逻辑(例如,使用RegEx)并将其作为属性或方法移至您的Customer类。