43 votes

Fusion de deux IEnumerable<T>s

J'ai deux IEnumerable<T> s.

L'un d'entre eux est rempli avec les éléments de repli. Celui-ci contiendra toujours le plus grand nombre d'éléments. L'autre sera rempli en fonction de certains paramètres et contiendra peut-être moins d'éléments. Si un élément n'existe pas dans le second, je dois le remplir avec l'élément équivalent du premier.

Ce code fait le travail, mais me semble inefficace et m'oblige à convertir les IEnumerables en ILists ou à utiliser une liste temporaire. Person implémente 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);  
}

Des suggestions ?

50voto

Jon Skeet Points 692016
translated.Union(fallback)

ou (si Person n'implémente pas IEquatable<Person> par ID)

translated.Union(fallback, PersonComparer.Instance)

où se trouve PersonComparer :

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;
    }
}

33voto

JaredPar Points 333733

Essayez ceci.

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)));
}

0voto

smenon Points 21

Utiliser Concat . Union ne fonctionne pas dans le cas où List<dynamic> type

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X