[asp.net-mvc]LINQy 检查是否任何多个集合中的对象具有相同的属性值的方法

发布时间: 2017/3/25 9:53:12
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有三个集合的相同的模型,只需要更改他们的名字。

要检查三个列表以便︰

1) 如果在两个列表中的元素已经是在另一个突发误码
2) 当我尝试验证任何不接受 null 值。
他们接受字符串为空?

但我不能。

我哪里错了?

item.Requeridos> ICollection<MeetingUser>
item.Informados> ICollection<MeetingUser>
item.Opcionais> ICollection<MeetingUser>

public static ValidationResult validaUsuariosNaLista(Reuniao item)
{
    var requeridos = item.Requeridos.Select(x => string.IsNullOrWhiteSpace(x.Login)).Any();
    var informados = item.Informados.Select(x => string.IsNullOrWhiteSpace(x.Login)).Any();
    var opcionais  = item.Opcionais .Select(x => string.IsNullOrWhiteSpace(x.Login)).Any();

    if (item.Requeridos.Count() + item.Informados.Count() + item.Opcionais.Count() > item.Requeridos.Concat(item.Informados).Concat(item.Opcionais).Distinct().Count())
    {
        return new ValidationResult(Resources.Validations.sameUserInOtherList);
    }

    return ValidationResult.Success;
}

解决方法 1:

我哪里错了?

方式, Distinct 工作。根据MSDN

Distinct(IEnumerable) 方法返回不包含重复值的无序的序列。它使用默认的相等比较器,默认情况下,值进行比较。

使用默认的相等比较器,默认情况下,实现 IEquatable 泛型接口的类型的值进行比较。要比较的自定义数据类型,你必须实现此接口,提供您自己从此和 Equals 方法的类型。

你的情况你有一个自定义的数据类型, MeetingUser

你可以做什么?

如果你避免使用 Distinct ,你可以试试以下︰

// Initially you concat the three list to one list
var combinedLists = (item.Requeridos.Concat(item.Informados)).Concat(item.Opcionais);

// Then you group them by the Login. If there is any group with more that 1
// element then you have the same login more that one time.
var result = combinedLists.GroupBy(x=>x.Login)
                          .Any(gr=>gr.Count()>1);

否则为如果你坚持 Distinct ,您必须实现 IEquatable 接口。

赞助商