当前位置:  开发笔记 > 编程语言 > 正文

合并两个IEnumerable <T>

如何解决《合并两个IEnumerable<T>》经验,为你挑选了2个好方法。

我有两个IEnumerable.

一个人充满了后备元素.这个将始终包含最多的元素.另一个将根据某些参数填充,并且可能包含更少的元素.如果第二个元素不存在,我需要用第一个元素填充它.

这段代码完成了这项工作,但对我来说效率低下并要求我将IEnumerables转换为ILists或使用临时列表Person实现IEquatable

IEnumerable fallBack = Repository.GetPersons();
IList translated = Repository.GetPersons(language).ToList();

foreach (Person person in fallBack)
{
    if (!translated.Any(p=>p.equals(person)))
        translated.add(person);  
}

有什么建议?



1> Jon Skeet..:
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;
    }
}


实际上,我担心它似乎不是我的目标解决方案.这将为我提供包含其中所有元素的集合,并且它永远不会达到我的Equals(Person other)方法.我做错了什么或者我错误地传达了我的问题?

2> JaredPar..:

试试这个.

public static IEnumerable SmartCombine(IEnumerable fallback, IEnumerable translated) {
  return translated.Concat(fallback.Where(p => !translated.Any(x => x.id.equals(p.id)));
}


这很好用但是你必须要注意一个问题:http://programmaticallyspeaking.com/how-enumerableconcat-brought-down-a-production-server.html
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有