无法隐式转换类型';字符串';到';bool';[If语句]

本文关键字:bool If 语句 字符串 类型 转换 | 更新日期: 2023-09-27 18:21:53

我在mvc 中进行了此验证

public static ValidationResult validaUsuariosNaLista(Reuniao item)
{
    var requeridos = item.Requeridos.Select(x => x.Login).Any();
    var informados = item.Informados.Select(y => y.Login).Any();
    var opcionais = item.Opcionais.Select(z => z.Login ? z.Login : null).Any();
    if (requeridos == informados || requeridos == opcionais || informados == opcionais)
        return new ValidationResult(Resources.Validations.ValidaUsuarioMesmaLista);
    return ValidationResult.Success;
}

我试着制作一个不同的if in line

var opcionais = item.Opcionais.Select(z => z.Login ? z.Login : null).Any();

但显示错误

错误3无法将类型"string"隐式转换为"bool"

z。登录字符串

验证是使字段没有值,它接收到的值为null。

否则,它会爆发为空的错误。

我想让他收到零而不给它错误。

它会选择列表中的z.login。如果其他列表中有相同的登录名,那么他就是错误的。

我怎么能这样"如果"那样做?

无法隐式转换类型';字符串';到';bool';[If语句]

如果z.Login是字符串,则此表达式无效:

z.Login ? z.Login : null

该表达式中的第一个元素必须是bool。在这种情况下,你到底想检查什么?z.Login是否为null?如果是这样的话,那么你根本不需要一个条件:

.Select(z => z.Login)

既然你只是用null替换null。或者,如果你想将空字符串解释为null,那么你可以使用这样的东西:

.Select(z => string.IsNullOrEmpty(z.Login) ? nulll : z.Login)

尽管最初还不清楚您想用这行代码实现什么。CCD_ 8将返回指示集合中是否存在任何匹配元素的CCD_。但是,由于您在.Any()中没有使用谓词,因此如果集合中有任何元素,它将返回true。这不仅使.Select()变得毫无意义,而且不会告诉您任何关于.Select()中该条件的信息。

也许您正在尝试查找集合中是否存在任何null值?:

item.Opcionais.Any(z => z.Login == null)

或任何"null或empty"值?:

item.Opcionais.Any(z => string.IsNullOrEmpty(z.Login))

或者相反,任何非空值?:

item.Opcionais.Any(z => !string.IsNullOrEmpty(z.Login))

等等…

z.登录是字符串

验证是使字段没有值,它接收到的值为null。

这样做:

编辑:更新此部分以查找重复

public static ValidationResult validaUsuariosNaLista(Reuniao item)
{
    var requeridos = item.Requeridos.Any(x => string.IsNullOrWhiteSpace(x.Login));
    var informados = item.Informados.Any(x => string.IsNullOrWhiteSpace(x.Login));
    var opcionais  = item.Opcionais .Any(x => string.IsNullOrWhiteSpace(x.Login));
    //does every item have a value?
    if (requeridos || informados || opcionais)
        return new ValidationResult(Resources.Validations.ValidaUsuarioMesmaLista);
    //are all of the items unique?
    if (item.Requeridos.Count() + item.Informados.Count() + item.Opcionais.Count() > 
          item.Requeridos.Concat(item.Informados).Concat(item.Opcionais).Distinct().Count)
    {
       //some items are duplicated
    }
    return ValidationResult.Success;
}

而且,为了好玩,为了避免重复代码:

public static ValidationResult validaUsuariosNaLista(Reuniao item)
{
    var HasEmptyValue = s => s.Any(x => string.IsNullOrWhiteSpace(x.Login));
    //does every item have a value?
    if (HasEmptyValue(item.Requeridos) || HasEmptyValue(item.Informados) || HasEmptyValue(item.Opcionais))
        return new ValidationResult(Resources.Validations.ValidaUsuarioMesmaLista);
    //are all of the items unique?
    if (item.Requeridos.Count() + item.Informados.Count() + item.Opcionais.Count() > 
          item.Requeridos.Concat(item.Informados).Concat(item.Opcionais).Distinct().Count)
    {
       //some items are duplicated
    }
    return ValidationResult.Success;
}

虽然我不是100%的类型推理在这里的工作效果。。。我得看看编译器是怎么做的,我没有你的类型可以测试。但在最坏的情况下,您只需要在var声明中明确。

我认为您要做的是检查Login是null还是空的。假设您希望opcionais是基于.Any()语句的布尔值:

var opcionais = item.Opcionais.Select(z => z.Login ? z.Login : null).Any();

应该是

var opcionais = item.Opcionais.Any(z => !string.IsNullOrEmpty(z.Login));