LINQy检查多个集合中的任何对象是否具有相同属性值的方法

时间:2015-11-13 18:40:18

标签: c# asp.net-mvc linq asp.net-mvc-4

我有三个相同型号的系列,只更改了它们的名称。

想检查三个列表,以便:

1)如果任一列表中的元素已经在另一个突发中,则出现错误 2)当我尝试验证Any不接受空值时 他们如何接受字符串为空?

但我不能。

我哪里出错了?

item.Requeridos&gt; ICollection<MeetingUser>
item.Informados&gt; ICollection<MeetingUser>
item.Opcionais&gt; 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;
}

2 个答案:

答案 0 :(得分:3)

  

我哪里出错了?

Distinct的工作方式。根据{{​​3}}

  

Distinct(IEnumerable)方法返回一个   无序序列,不包含重复值。它使用了   default equality comparer,Default,比较值。

     

默认的相等比较器Default用于比较的值   实现IEquatable泛型接口的类型。 要   比较自定义数据类型,您必须实现此接口和   为类型提供自己的GetHashCode和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界面。

答案 1 :(得分:0)

最终答案:

如果对象也可以为null,则使用item.Opcionais作为示例

Tks @Christos 这么多 你的答案非常好

public class ReuniaoValidation
    {
        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 ?? Enumerable.Empty<MeetingUser>();

            var listasCombinadas = (item.Requeridos.Concat(item.Informados)).Concat(item.Opcionais ?? Enumerable.Empty<MeetingUser>());

            if (listasCombinadas.GroupBy(x => x.Login).Any(gr => gr.Count() > 1))
            {
                item.AddOdm = false;
                return new ValidationResult(Resources.Validations.ValidaUsuarioMesmaLista);                
            }

            return ValidationResult.Success;
        }