我有三个 User
列表:
ICollection<User> listOne = _somewhere.GetUsers(1);
ICollection<User> listTwo = _somewhere.GetUsers(2);
ICollection<User> listThree = _somewhere.GetUsers(3);
要比较的“唯一”标识符是一个名为“Email”的字符串字段。
我如何从这三个列表中获得一个唯一的列表(例如没有被骗)。
在使用Except
之前,我从两个 列表中得到了一个唯一列表,但不确定如何使用三个列表?我是否必须对前两个使用 Except
,然后对前两个和第三个的结果再次使用?
另外,我应该提一下,用户列表来自外部 Web API 调用,不能保证每个列表都有一个唯一的电子邮件地址列表。
所以我需要两个步骤:
- 在每个列表中,摆脱欺骗
- 合并三个唯一列表以获得一个唯一列表。
最佳答案
您可以只合并列表并在组合列表上执行一次重复数据删除(使用 Distinct()
)。
var uniqueList = listOne.Union(listTwo)
.Union(listThree)
.Distinct(new EmailComparer())
.ToList();
对于比较器可以像这样简单:
class EmailComparer : IEqualityComparer<User>
{
public bool Equals(User x, User y)
{
return x.Email == y.Email;
}
public int GetHashCode(User obj)
{
return obj.Email.GetHashCode();
}
}
编辑:
正如评论中指出的,如果我们将自定义电子邮件比较器应用于 Union()
,则不需要 Distinct()
:
var emailComparer = new EmailComparer();
var uniqueList = listOne.Union(listTwo, emailComparer)
.Union(listThree, emailComparer)
.ToList();
关于c# - 从三个非唯一的 List<T> 中获取一个唯一的 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9027301/