Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

151
Visualizações
Seleccionar el primer valor no nulo en un modelo

Digamos que tengo una clase modelo que se ve así:

 public class ModelTest { public string val1 {get;set;} public string val2 {get;set;} public string val3 {get;set;} }

En algún lugar de mi código, este ModelTest obtiene sus datos. La advertencia es que, solo 1 de ellos tendrá un valor

 var model = new ModelTest() {val1=null, val2="value", val3=null} //Sudo code

Lo que estoy tratando de hacer de alguna manera es comparar un valor con cualquiera de los 3 elementos que puedan tener valores, por lo que algo como:

 var testCompare = "someValue" if (testCompare == model. ....//how can I get the NOT NULL value from ModelTest here for comparison
over 4 years ago · Santiago Trujillo
6 Respostas
Responde à pergunta

0

Si bien su modelo de datos no es ideal, es posible verificar cada una de las propiedades utilizando el || operador para comparar cada valor. Siempre que su variable testCompare no contenga valores nulos, también puede omitir una comprobación de valores nulos.

 if (model.val1 == testCompare || model.val2 == testCompare || model.val3 == testCompare) { }

Como se menciona en los comentarios, si desea una versión más sucinta, puede usar el operador de fusión nula, ?? , para verificar las propiedades posteriores si su propiedad anterior devuelve nulo. Al final de la cadena de fusión nula, la primera propiedad no nula se comparará con su cadena testCompare . Tenga en cuenta que debe envolver las tres propiedades entre paréntesis y que esto tiene un comportamiento diferente; solo prueba la primera propiedad no nula, mientras que la versión anterior prueba TODAS las propiedades para una coincidencia.

 if (testCompare == (model.val1 ?? model.val2 ?? model.val3)) { }
over 4 years ago · Santiago Trujillo Relatório

0

Probablemente podría crear un método (o incluso una propiedad) como:

 public string Val() { if (val1 != null) return val1; if (val2 != null) return val2; if (val3 != null) return val3; return null; }

Probablemente haya una forma más corta de escribir este código. Además, si dos o más de los valores no son nulos, devolverá el primero.

over 4 years ago · Santiago Trujillo Relatório

0

Puede agregar una propiedad a su clase ModelTest que proporcione el primer valor no nulo (si lo hay) en su objeto:

 public class ModelTest { public string val1 { get; set; } public string val2 { get; set; } public string val3 { get; set; } public string val => val1 ?? val2 ?? val3; }

y luego verifique contra eso:

 if (model.val == testCompare) { }
over 4 years ago · Santiago Trujillo Relatório

0

¿Qué pasa con la solución que contiene una combinación de reflexión y Linq,

Datos de prueba

 var model = new ModelTest() {val1=null, val2="value", val3=null} ;

Uso

 var result = model.GetType() .GetProperties() .FirstOrDefault(prop => prop.GetValue(model, null) != null);

Imprimir resultado

 Console.WriteLine(result.GetValue(model));

Este es mi primer intento con la reflexión, las sugerencias son muy bienvenidas.

.Net violín


Nota: Esta es solo una solución alternativa , menos eficaz . Si está buscando una solución elegante, pruebe otras soluciones.

over 4 years ago · Santiago Trujillo Relatório

0

Es un caso de uso muy extraño, pero vamos con él. Aquí otra opción para la fogata..

 public class ModelTest { private string _val; public string val1 {get => _val; set => _val ??= value;} public string val2 {get => _val; set => _val ??= value;} public string val3 {get => _val; set => _val ??= value;} }

Cualquiera de estos que se establece en no nulo termina asignando ese valor a _val - ??= escribe la mano derecha en la mano izquierda solo si la mano izquierda es nula, esencialmente como left = left ?? right

No importa cuál use para acceder al valor.

Tenga en cuenta que solo hay una ubicación de almacenamiento de datos, por lo que este enfoque no puede recordar dos valores, o qué valor no era nulo. No usaría esto para propiedades dispares como nombre, dirección y número de seguro social porque podría tener efectos extraños en otros lugares. Esto es para un caso de uso muy limitado de "hay tres propiedades que son esencialmente lo mismo, no se pueden colapsar en una, y no sé cuál se establecerá, pero puedo tratarlas de forma equivalente para leer".

over 4 years ago · Santiago Trujillo Relatório

0

Puede anular el método 'Equals' de la clase ModelTest como desee. Ejemplo:

 public class ModelTest { public string val1 {get;set;} public string val2 {get;set;} public string val3 {get;set;} public override bool Equals(object obj) { if(!typeof(string).IsInstanceOfType(obj)) return base.Equals(obj); string value = obj as string; if (val1.Equals(value)) return true; if (val2.Equals(value)) return true; if (val3.Equals(value)) return true; return false; } }

Para usar el método:

 if(model.Equals("yourValue")) ...
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda