删除distinct的优先级

时间:2017-05-29 14:29:36

标签: c# distinct iequalitycomparer

我有一个包含许多变量的对象,我想要一个不同的函数来比较两个变量(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;
    }

}

1 个答案:

答案 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类。