Слияние двух IEnumerable <T>s - PullRequest
       35

Слияние двух IEnumerable <T>s

42 голосов
/ 26 февраля 2009

У меня есть два IEnumerable<T> с.

Человек наполняется запасными элементами. Этот всегда будет содержать большинство элементов. Другой будет заполнен в зависимости от некоторых параметров и, возможно, будет содержать меньше элементов. Если элемент не существует во втором, мне нужно заполнить его эквивалентом первого.

Этот код выполняет свою работу, но для меня он неэффективен и требует от меня приведения IEnumerables к ILists или использования временного списка Человек реализует 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);  
}

Есть предложения?

Ответы [ 3 ]

50 голосов
/ 26 февраля 2009
translated.Union(fallback)

или (если человек не реализует IEquatable<Person> по ID)

translated.Union(fallback, PersonComparer.Instance)

где 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;
    }
}
32 голосов
/ 26 февраля 2009

Попробуйте это.

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)));
}
0 голосов
/ 01 января 2016

используйте Concat. Union не работает в случае List<dynamic> тип

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...