合并两个IEnumerable <T>

我有两个IEnumerable<T> s。

一个充满了后备ellements。 这一个将永远包含最多的元素。 另一个将根据一些参数得到填充,并可能包含更less的元素。 如果第二个元素不存在,我需要用第一个元素填充它。

此代码完成这项工作,但感觉效率低下,并要求我将IEnumerables投给IList或使用临时列表Person实现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); } 

有什么build议么?

尝试这个。

 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))); } 
 translated.Union(fallback) 

或者(如果Person不通过ID实现IEquatable<Person>

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

使用Concat 。 如果List<dynamic>types, Union不起作用