我有两个IEnumerable<T>.
一个人充满了后备元素.这个将始终包含最多的元素.另一个将根据某些参数填充,并且可能包含更少的元素.如果第二个元素不存在,我需要用第一个元素填充它.
这段代码完成了这项工作,但对我来说效率低下并要求我将IEnumerables转换为ILists或使用临时列表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);
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
Jon*_*eet 50
translated.Union(fallback)
Run Code Online (Sandbox Code Playgroud)
或(如果Person没有IEquatable<Person>通过ID 实现)
translated.Union(fallback, PersonComparer.Instance)
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Jar*_*Par 32
试试这个.
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)));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35759 次 |
| 最近记录: |