c# - truco - Fusionando dos IEnumerable<T> s
truco para fusionar paginas de facebook (3)
Tengo dos IEnumerable<T>
s.
Uno se llena con los elementos de reserva. Este siempre contendrá la mayoría de los elementos. El otro se llenará dependiendo de algunos parámetros y posiblemente contendrá menos elementos. Si un elemento no existe en el segundo, necesito completarlo con el equivalente al primero.
Este código hace el trabajo, pero me parece ineficiente y me obliga a convertir los IEnumerables a ILists o a utilizar una lista temporal Person implements IEquatable
IEnumerable<Person> fallBack = Repository.GetPersons();
IList<Person> translated = Repository.GetPersons(language).ToList();
foreach (Person person in fallBack)
{
if (!translated.Any(p=>p.equals(person)))
translated.add(person);
}
¿Alguna sugerencia?
Prueba esto.
public static IEnumerable<Person> SmartCombine(IEnumerable<Person> fallback, IEnumerable<Person> translated) {
return translated.Concat(fallback.Where(p => !translated.Any(x => x.id.equals(p.id)));
}
usa Concat
Union
no funciona en el caso de tipo List<dynamic>
translated.Union(fallback)
o (si la persona no implementa IEquatable<Person>
por ID)
translated.Union(fallback, PersonComparer.Instance)
donde PersonComparer es:
public class PersonComparer : IEqualityComparer<Person>
{
public static readonly PersonComparer Instance = new PersonComparer();
// We don''t need any more instances
private PersonComparer() {}
public int GetHashCode(Person p)
{
return p.id;
}
public bool Equals(Person p1, Person p2)
{
if (Object.ReferenceEquals(p1, p2))
{
return true;
}
if (Object.ReferenceEquals(p1, null) ||
Object.ReferenceEquals(p2, null))
{
return false;
}
return p1.id == p2.id;
}
}