Condición 1: en el siguiente código, en algún momento list2 es nulo, por lo tanto, realizo una comprobación como, list2 == null ? 0 : list2.Wher.....

Condición 1: Algunos de los nombres list1 tampoco están en list2, para eso quiero establecer Age = 0

¿Cómo satisfacer ambas condiciones?

class Program
{
    static void Main(string[] args)
    {
        var list1 = new List<List1> { new List1 { Name = "A1" }, new List1 { Name = "A2" } };

        //sometime my "list2" is null as well
        //var list2 = null;
        var list2 = new List<List2> { new List2 { Name = "A1", Age = 10 } };

        foreach (var a in list1)
        {
            var X = list2 == null ? 0 : list2.Where(x => x.Name == a.Name).FirstOrDefault().Age;
        }
    }
}

public class List1
{
    public string Name { get; set; }
}


public class List2
{
    public string Name { get; set; }
    public int Age { get; set; }
}
c#
1
user584018 19 ene. 2018 a las 13:39

3 respuestas

La mejor respuesta

No necesita el bucle foreach en absoluto.

Puedes resolver así:

var x = list2 == null ? 0 : 
     list2.Where(x => list1.Any(e => x.Name == e.Name)).FirstOrDefault()?.Age ?? 0;

U otra variante sería:

var x = list2 == null ? 0 : 
      list2.FirstOrDefault(x => list1.Any(e => x.Name == e.Name))?.Age ?? 0;
2
Ousmane D. 19 ene. 2018 a las 10:55

Primero, eche un vistazo a Esta documentación . Explica el .DefaultIfEmpty que usaré.

DefaultIfEmpty:

Devuelve los elementos de la secuencia especificada o el valor especificado en una colección singleton si la secuencia está vacía.

Lo que puede hacer en su caso para satisfacer ambas condiciones en el siguiente:

var X = list2 == null ? 0 : list2.Where(x => x.Name == a.Name).DefaultIfEmpty(new List2 { Age = 0 }).First().Age;
1
Paul Karam 19 ene. 2018 a las 10:56

Prueba esto:

foreach (var a in list1)
{
    var X = list2 == null ? 0 : (list2.Where(x => x.Name == a.Name).FirstOrDefault()?.Age ?? 0);
}
2
SBFrancies 19 ene. 2018 a las 10:46
48339171