合并两个IEnumerable <t> s </t>

时间:2009-02-26 15:21:30

标签: c# merge

我有两个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);  
}

有什么建议吗?

3 个答案:

答案 0 :(得分:50)

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

答案 1 :(得分: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)));
}

答案 2 :(得分:0)

使用Concat。如果Union类型

List<dynamic>不起作用