Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于一个属性合并两个列表并连接其他属性 IList ob1={new MyObject{Id=“1”,Items={BananaObject1,BananaObject2}} IList ob2={new MyObject{Id=“1”,Items={BananaObject2,BananaObject3}, 新的MyObject{Id=“2”,Items={BananaObject3,BananaObject3}}_C#_Linq_Join_Ienumerable_Sql To Linq Conversion - Fatal编程技术网

C# 基于一个属性合并两个列表并连接其他属性 IList ob1={new MyObject{Id=“1”,Items={BananaObject1,BananaObject2}} IList ob2={new MyObject{Id=“1”,Items={BananaObject2,BananaObject3}, 新的MyObject{Id=“2”,Items={BananaObject3,BananaObject3}}

C# 基于一个属性合并两个列表并连接其他属性 IList ob1={new MyObject{Id=“1”,Items={BananaObject1,BananaObject2}} IList ob2={new MyObject{Id=“1”,Items={BananaObject2,BananaObject3}, 新的MyObject{Id=“2”,Items={BananaObject3,BananaObject3}},c#,linq,join,ienumerable,sql-to-linq-conversion,C#,Linq,Join,Ienumerable,Sql To Linq Conversion,我想合并这两个列表,以便生成的列表 IList<MyObject> ob1 = {new MyObject {Id = "1", Items = {BananaObject1, BananaObject2}}} IList<MyObject> ob2 = { new MyObject {Id = "1", Items = {BananaObject2, BananaObject3}}, new MyObject {Id = "2", Items = {Banana

我想合并这两个列表,以便生成的列表

IList<MyObject> ob1 = {new MyObject {Id = "1", Items = {BananaObject1, BananaObject2}}}  
IList<MyObject> ob2 = { new MyObject {Id = "1", Items = {BananaObject2, BananaObject3}},  
new MyObject {Id = "2", Items = {BananaObject3, BananaObject3}}}
IList ob2={new MyObject{Id=“1”,Items={BananaObject1,BananaObject2,BananaObject3},
新的MyObject{Id=“2”,Items={BananaObject3,BananaObject3}}
因此,由于两个列表中第一项的id相同,因此它们成为一个,并且它们的一个属性被连接起来。
我可以做一个for循环来实现这一点,但我正在为此寻找一个整洁、性能最好的linq表达式


感谢您

Concat
将列表合并在一起,
GroupBy
Id属性,
选择many
以获取合并的项目列表:

IList<MyObject> ob2 = { new MyObject {Id = "1", Items = {BananaObject1, BananaObject2, BananaObject3}},
new MyObject {Id = "2", Items = {BananaObject3, BananaObject3}}}
使用:

obj1.FullGroupJoin(obj2,
a=>a.Id,
b=>b.Id,
(id,a,b)=>new{id=id,Items=a.Items.Union(b.Items)},
new{id=-1,Items=new List()},//左侧为默认值
新的{id=-2,Items=newlist()})//默认为右侧

我认为您应该在这里使用
Concat
,而不是
Union
。除非相同的
MyObject
被添加两次,否则不会有任何重复数据消除。根据问题
g.SelectMany(o=>o.Items)。Distinct().ToList()
我同意上面的两条评论。对,两条评论都包含在答案中。谢谢如果一个
MyObject
中的
Items
已包含重复项(如
ob2[1]的情况)。Items
包含重复的
BananaObject3
),是否要保留重复项?可能的重复项我不想保留重复项,谢谢!抱歉,我想FullGroupJoin还没有进入主分支,但代码如下:这里还有另一个答案:
ob1.Concat(ob2)
   .GroupBy(o => o.Id)
   .Select(g => new MyObject() 
   { 
      Id = g.Key, 
      Items = g.SelectMany(o => o.Items ).Distinct().ToList()
   });
obj1.FullGroupJoin(obj2, 
  a=>a.Id,
  b=>b.Id,
  (id,a,b)=>new {id=id,Items=a.Items.Union(b.Items)},
  new {id=-1, Items=new List<string>()}, //Default for left side
  new {id=-2, Items=new List<string>()});//Default for right side