如何消除列表中的重复项?

时间:2011-10-05 14:18:22

标签: c# .net linq hash

class infoContact
{ 



    private string contacts_first_nameField;

    private string contacts_middle_nameField;

    private string contacts_last_nameField;        

    private Phonenumber[] phone_numbersField;

    private Emailaddress[] emailField;
}

我有一个List<infoContact>这个列表包含了近7000个我从其他程序中得到的内容。在7000个列表中,6500个是重复的。我正在寻找一种如何消除重复的方法。

如果first_name,last_name,emailaddresses,电话号码相同,则infoContact会重复。

我想过使用HashSet<infoContact>并覆盖infoContact的getHashCode()。

我很想知道这是否是最好的方法。如果这不是一个好方法,那么更好的方法是什么?

7 个答案:

答案 0 :(得分:5)

您可以使用带有IEqualityComparer<T>的Distinct扩展方法。只需编写一个实现该接口的类,然后进行比较,然后就可以执行以下操作:

var filteredList = oldList.Distinct(new InfoContactComparer());

答案 1 :(得分:1)

使用您想要的参数覆盖equals方法,以便您可以通过equals

比较对象

答案 2 :(得分:1)

我创建了从列表类中删除已扣除的项目,然后才能使用它,

List<string> list = new List<string>();

        foreach (string line in File.ReadAllLines(somefile.txt))
        {
            if (!list.Contains(line))
            {
                list.Add(line);
            }
        }

答案 3 :(得分:0)

两个选项:覆盖GetHashCodeEquals如果您控制infoContact 的来源,您的覆盖对于该类的任何特定用途都是正确的。

否则,定义一个实现IEqualityComparer<infoContact>的类,它还允许您定义正确的EqualsGetHashCode方法,然后将其实例传递给HashSet<infoContact>构造函数进入listOfContacts.Distinct方法调用(使用Linq)。

注意:您的问题似乎是基于GetHashCode应确定平等或唯一性的想法。不应该!它是允许HashSet完成其工作的工具的一部分,但不需要为不等实例返回唯一值。这些值应该很好地分布,但它们最终可能重叠。

简而言之,两个相等的实例应具有相同的哈希码,但共享相同哈希码的两个实例不一定相等。有关GetHashCodeplease visit this blog

的指南的更多信息

答案 4 :(得分:0)

将您的班级infoContact实施为IEquatable<infoContact>的衍生物:

class InfoContact : IEquatable<InfoContact> {
  string contacts_first_nameField;
  string contacts_last_nameField;
  object[] phone_numbersField;
  object[] emailField;
  // other fields

  public bool Equals(InfoContact other) {
    return contacts_first_nameField.Equals(other.contacts_first_nameField)
           && contacts_last_nameField.Equals(other.contacts_last_nameField)
           && phone_numbersField.Equals(other.phone_numbersField)
           && emailField.Equals(other.emailField);
  }
}

并使用Linqs Enumerable.Distinct方法过滤重复项:

var infoContacts = GetInfoContacts().Distinct();

答案 5 :(得分:0)

正确的方法是覆盖equals方法!

这样,当你在列表中添加新元素时,不会添加元素!

答案 6 :(得分:0)

首先考虑提取唯一值。您可以将Distinct()Linq方法与比较器一起使用,如:

public class infoContactComparer : IEqualityComparer<infoContact>
{
    public bool Equals(infoContact x, infoContact y)
    {
        return x.contacts_first_nameField == y.contacts_first_nameField
            && x.contacts_last_nameField == y.contacts_last_nameField
            && ...
    }

    public int GetHashCode(infoContact obj)
    {
        return obj.contacts_first_nameField.GetHashCode();
    }
}