Unión lista que depende/selecciona el valor de las propiedades

Pregunta hecha: hace 8 meses Ultima actividad: hace 8 meses
up 0 down

Tengo un "elemento" de clase:

    public class Item
    {
        public int Id { get; set; }
        public decimal Price { get; set; }

        public override bool Equals(object obj)
        {
            if (obj is Item item)
                return item.Id == Id;

            return false;
        }

        // GetHashCode omitted...
    }

Y tengo 2 listas que necesito a la unión:

        var items1 = new List<Item>
        {
            new Item { Id = 1, Price = 10 },
            new Item { Id = 2, Price = 10 },
            new Item { Id = 3, Price = 10 },
        };

        var items2 = new List<Item>
        {
            new Item { Id = 1, Price = 10 },
            new Item { Id = 2, Price = 8 },
            new Item { Id = 4, Price = 10 },
        };

La unión consigo de esta manera:

var union = items1.Union(items2).ToList();

Pero necesito también la restricción de que los artículos con el precio más bajo es en la unión. Tan por ejemplo en las listas anteriores Item.ID = 2 de "determinados elementos2" debe estar en la unión... por lo que el resultado debe ser una lista que consiste en estos 4 elementos:

  • Artículo {Id = 1, Precio = 10}
  • Artículo {Id = 2, Precio = 8} // No es la una con Precio = 10
  • Artículo {Id = 3, Precio = 10}
  • Artículo {Id = 4, Precio = 10}

¿Hay una manera elegante de hacer esto en C# (preferiblemente usando LINQ)?

1 respuesta

up 3 down accepted

Puedes probar a utilizar GroupBy, como a continuación:

var result = items1.Union(items2).GroupBy(x => x.Id)
                 .Select(x => new Item
                 {
                     Id = x.Key,
                     Price = x.Min(i => i.Price)
                 });