C# 合并两个IEnumerable<;T>;s

C# 合并两个IEnumerable<;T>;s,c#,merge,C#,Merge,我有两个IEnumerables 一个被后援部队填满。这一个总是包含最多的元素。 另一个将根据某些参数填充,并且可能包含较少的元素。 如果第二个元素中不存在元素,我需要用第一个元素的等效元素填充它 这段代码完成了这项工作,但对我来说效率很低,需要我将IEnumerables强制转换为ILists或使用临时列表 人是可以胜任的 IEnumerable<Person> fallBack = Repository.GetPersons(); IList<Person> tran

我有两个
IEnumerable
s

一个被后援部队填满。这一个总是包含最多的元素。 另一个将根据某些参数填充,并且可能包含较少的元素。 如果第二个元素中不存在元素,我需要用第一个元素的等效元素填充它

这段代码完成了这项工作,但对我来说效率很低,需要我将IEnumerables强制转换为ILists或使用临时列表 人是可以胜任的

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);  
}
IEnumerable fallBack=Repository.GetPersons();
IList translated=Repository.GetPersons(language.ToList();
foreach(后备人员)
{
如果(!translated.Any(p=>p.equals(person)))
加(人);
}
有什么建议吗

translated.Union(fallback)
或者(如果人员未按ID实现
IEquatable

其中,人员比较人是:

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;
    }
}
公共类人员比较者:IEqualityComparer
{
public static readonly PersonComparer实例=new PersonComparer();
//我们不需要更多的实例
私人PersonComparer(){}
公共int GetHashCode(个人p)
{
返回p.id;
}
公共bool等于(人员p1、人员p2)
{
if(Object.ReferenceEquals(p1,p2))
{
返回true;
}
if(Object.ReferenceEquals)(p1,null)||
Object.ReferenceEquals(p2,null))
{
返回false;
}
返回p1.id==p2.id;
}
}
试试这个

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)));
}
公共静态IEnumerable SmartCombine(IEnumerable回退,IEnumerable转换){
返回translated.Concat(fallback.Where(p=>!translated.Any)(x=>x.id.equals(p.id));
}

使用
Concat
Union
在case
List
type

中不起作用,但只有在Person类正确实现了平等的情况下才会起作用。从OP判断,我猜他们不会。哈哈!Jon,你不能把它打包成更复杂的东西吗?我再次感到非常愚蠢:实际上他们是这样做的。OP还包含了no真正的代码。一部分是因为它简化了我的问题,另一部分是因为我的老板对在公共场所使用代码的要求很严格:s@Jared当前位置我正在到达那里:)事实上,我担心这似乎不是我想要的解决方案。这将为我提供一个集合,其中包含来自这两个集合的所有元素,并且它永远不会影响我的Equals(Person-other)方法。我是做错了什么,还是我把我的问题传达错了?这很有效,但有一个问题你必须注意:我会避免多次消费iEnumber。作为“引擎盖下”,它可以重新连接到DB或对每个枚举进行一些计算。或者,说,只是无限的。。。
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)));
}