我有三个相同型号的系列,只更改了它们的名称。
想检查三个列表,以便:
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;
}
答案 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;
}