无法在ASP.net 6.1中使用Distinct和IEqualityComparer

时间:2018-04-11 16:16:00

标签: asp.net distinct iequalitycomparer

我尝试在电子邮件地址和电话号码匹配时删除重复的条目。我已经尝试了几种解决方案,但我无法解决任何问题。我甚至尝试过下面发布的链接中的C#样本。

https://msdn.microsoft.com/en-us/library/bb338049(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

似乎调用实际方法的行无法正常工作。在调试模式下,我希望程序在执行比较器时会慢一点。它似乎只是绕过了比较器。这是我如何调用比较器。

IEnumerable<MerchantConsumer> noduplicates = consumers2.Distinct(new MerchantConsumerComparer2());

我已将比较器代码添加到我的Controller中并在那里调用它。我还将比较器代码添加到实际的实体(MerchantConsumer类)中并在那里调用它。

这是我的比较代码。

 public class MerchantConsumerComparer2 : IEqualityComparer<MerchantConsumer>
    {
        // Products are equal if their names and product numbers are equal.
        public bool Equals(MerchantConsumer x, MerchantConsumer y)
        {

            //Check whether the compared objects reference the same data.
            if (Object.ReferenceEquals(x, y)) return true;

            //Check whether any of the compared objects is null.
            if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
                return false;

            //Check whether the products' properties are equal.
            return x.Email == y.Email && x.PhoneNumber == y.PhoneNumber;
        }

        // If Equals() returns true for a pair of objects 
        // then GetHashCode() must return the same value for these objects.

        public int GetHashCode(MerchantConsumer consumer)
        {
            //Check whether the object is null
            if (Object.ReferenceEquals(consumer, null)) return 0;

            //Get hash code for the Name field if it is not null.
            int hashEmail = consumer.Email == null ? 0 : consumer.Email.GetHashCode();

            //Get hash code for the Code field.
            //int hashProductCode = product.Code.GetHashCode();
            int hashPhone = consumer.PhoneNumber == null ? 0 : consumer.PhoneNumber.GetHashCode();

            //Calculate the hash code for the product.
            return hashEmail ^ hashPhone;
        }

    }

这样可行,但它不会删除重复的电子邮件。

var consumersFiltered = consumerList.GroupBy(i => i.PhoneNumber).Select(g => g.FirstOrDefault()).ToList();

是否有任何删除重复项的新方法?

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

我实际上通过将其转换为类似的列表来实现此目的。在我看到的所有示例中,没有一个转换为列表。

var noduplicates = consumers2.Distinct(new MerchantConsumerComparer2()).ToList();

它似乎非常快,无论比较器是在Controller中还是在实体中,它都可以工作。