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
在caseList
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)));
}