我有两个 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);
}
有什么建议吗?
最佳答案
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;
}
}
关于c# - 合并两个 IEnumerable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/590991/