Hace unos días hice la misma pregunta con SQL, pero ahora surge en código C#
Digamos que tenemos este tipo de clase para contener diferentes pares de id/texto:
public class Text { public int id { get; set; } public string text { get; set; } ... }Ahora completemos algunos datos, ListA obtiene muchos datos:
List<Text> ListA = new List<Text>{ new () {id = 1, text = "aaa1"}, new () {id = 2, text = "aaa2"}, new () {id = 3, text = "aaa3"}, new () {id = 4, text = "aaa4"}, new () {id = 5, text = "aaa5"}, new () {id = 6, text = "aaa6"}, };Y ListB obtiene solo un poco de información:
List<Text> ListB = new List<Text>{ new () {id = 4, text = "bbb4"}, new () {id = 5, text = "bbb5"}, };Y ahora lo que estamos buscando:
var result = ... // Some Linq or Lambda magic goes here // and if we do: foreach(var item in result){ Console.WriteLine(item.Id + " " + item.Text); } // Result will be: 1 : aaa1 2 : aaa2 3 : aaa3 4 : bbb4 5 : bbb5 6 : aaa6Puedes intentar buscar id dentro de ListB :
var result = ListA .Select(a => ListB.FirstOrDefault(b => b.id == a.id) ?? a); Aquí, para cada a dentro de ListA , tratamos de encontrar el elemento correspondiente por id ( b.id == a.id ) dentro de ListB . Si no se encuentra tal elemento, simplemente devolvemos el elemento ListA : ?? item
En el caso de .Net 6, puede usar la versión sobrecargada .FirstOrDefault (podemos pasar a como valor predeterminado):
var result = ListA .Select(a => ListB.FirstOrDefault(b => a.id == b.id, a));Podría ser más eficiente convertir ListB en un diccionario primero: var dictB = ListB.ToDictionary(x=> x.id)
Entonces puedes escribir
var result = ListA.Select(x => dictB.TryGetValue(x.id, out var b) ? b : x)
UPD Reescrito teniendo en cuenta las sugerencias de comentarios
Una opción es realizar una operación de Union , especificando un EqualityComparer . Si el pedido es importante, puede realizar una operación OrderBy al final.
class TextIdComparer : EqualityComparer<Text> { public override bool Equals(Text x, Text y) => x.id == y.id; } var result = ListB.Union(ListA, new TextIdComparer()).OrderBy(x => x.id)