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