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()。
我很想知道这是否是最好的方法。如果这不是一个好方法,那么更好的方法是什么?
答案 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)
两个选项:覆盖GetHashCode
和Equals
如果您控制infoContact
的来源,您的覆盖对于该类的任何特定用途都是正确的。
否则,定义一个实现IEqualityComparer<infoContact>
的类,它还允许您定义正确的Equals
和GetHashCode
方法,然后将其实例传递给HashSet<infoContact>
构造函数或进入listOfContacts.Distinct
方法调用(使用Linq)。
注意:您的问题似乎是基于GetHashCode
应确定平等或唯一性的想法。不应该!它是允许HashSet完成其工作的工具的一部分,但不需要为不等实例返回唯一值。这些值应该很好地分布,但它们最终可能重叠。
简而言之,两个相等的实例应具有相同的哈希码,但共享相同哈希码的两个实例不一定相等。有关GetHashCode
,please 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();
}
}