c# - 从三个非唯一的 List<T> 中获取一个唯一的 List<T>

标签 c# .net linq

我有三个 User 列表:

ICollection<User> listOne = _somewhere.GetUsers(1);
ICollection<User> listTwo = _somewhere.GetUsers(2);
ICollection<User> listThree = _somewhere.GetUsers(3);

要比较的“唯一”标识符是一个名为“Email”的字符串字段。

我如何从这三个列表中获得一个唯一的列表(例如没有被骗)。

在使用Except 之前,我从两个 列表中得到了一个唯一列表,但不确定如何使用三个列表?我是否必须对前两个使用 Except,然后对前两个和第三个的结果再次使用?

另外,我应该提一下,用户列表来自外部 Web API 调用,不能保证每个列表都有一个唯一的电子邮件地址列表。

所以我需要两个步骤:

  1. 在每个列表中,摆脱欺骗
  2. 合并三个唯一列表以获得一个唯一列表。

最佳答案

您可以只合并列表并在组合列表上执行一次重复数据删除(使用 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/

相关文章:

c# - 在 asp.net mvc 中显示图像

.net - Linq - 'Queries with local collections are not supported' 时该怎么办

.net - 如何从 Windows 窗体应用程序打开记事本并在其中放置一些文本?

asp.net - : LINQ To SQL for data access 的最佳实践

c# - 计算数据表中的正值

c# - Show 和 ShowDialog 将不起作用

c# - 在 C# 中,如何在父级上调用方法并将方法调用链接到它的继承层次结构?

c# - 下载 PhantomJS 生成的 pdf 时遇到问题

c# - 是否有 .NET Framework 方法来解析电子邮件 (MIME)?

c# - 使用 HTML Agility Pack 和 Linq 解析 html