我有两个IEnumerable
.
一个人充满了后备元素.这个将始终包含最多的元素.另一个将根据某些参数填充,并且可能包含更少的元素.如果第二个元素不存在,我需要用第一个元素填充它.
这段代码完成了这项工作,但对我来说效率低下并要求我将IEnumerables转换为ILists或使用临时列表Person实现IEquatable
IEnumerablefallBack = Repository.GetPersons(); IList translated = Repository.GetPersons(language).ToList(); foreach (Person person in fallBack) { if (!translated.Any(p=>p.equals(person))) translated.add(person); }
有什么建议?
translated.Union(fallback)
或(如果Person没有IEquatable
通过ID 实现)
translated.Union(fallback, PersonComparer.Instance)
PersonComparer的位置是:
public class PersonComparer : IEqualityComparer{ 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; } }
试试这个.
public static IEnumerableSmartCombine(IEnumerable fallback, IEnumerable translated) { return translated.Concat(fallback.Where(p => !translated.Any(x => x.id.equals(p.id))); }