Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

150
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda