C# c交叉连接两个相同类型的列表

C# c交叉连接两个相同类型的列表,c#,.net,linq,.net-core,linq-to-entities,C#,.net,Linq,.net Core,Linq To Entities,这里我有一些代码,可以正常工作。但我想改变选择的部分,以其他东西,我不知道还有什么其他方法,我可以使用任何帮助将不胜感激 使用制度; 使用System.Linq; 使用System.Collections.Generic; 公共课程 { 公共静态真空总管 { var all=new List{new People{Id=1,Name=andy1,Age=null},new People{Id=2,Name=andy2,Age=null},new People{Id=3,Name=andy3,Ag

这里我有一些代码,可以正常工作。但我想改变选择的部分,以其他东西,我不知道还有什么其他方法,我可以使用任何帮助将不胜感激

使用制度; 使用System.Linq; 使用System.Collections.Generic; 公共课程 { 公共静态真空总管 { var all=new List{new People{Id=1,Name=andy1,Age=null},new People{Id=2,Name=andy2,Age=null},new People{Id=3,Name=andy3,Age=null},new People{Id=4,Name=andy4,Age=null}; var someofm=new List{new People{Id=1,Name=null,Age=1},new People{Id=2,Name=null,Age=1},new People{Id=3,Name=null,Age=1}; var test=其中一些。选择c=> { c、 Name=all.Finda=>a.Id==c.Id.Name; 返回c; }; 测试中的每个var项目 Console.WriteLine{0}={1}={2},item.Id,item.Name,item.Age; } } 公营阶层人士 { 公共整数Id { 收到 设置 } 公共信息 { 收到 设置 } 公共字符串名 { 收到 设置 } } 这是结果

1=andy1=1
2=andy2=1
3=andy3=1
我只是想知道有没有其他方法可以达到同样的效果,但更优雅的方式?还是更简单的方法

var test=其中一些。选择c=> { c、 Name=all.Finda=>a.Id==c.Id.Name; 返回c; }; 更新
很抱歉,起初我没有正确显示我的问题,我已更新了我的问题。请再次查看。

您可以使用C的LINQ关键字,更具体地说,与之相关的join关键字:

使用制度; 使用System.Linq; 使用System.Collections.Generic; 公共课程 { 公共静态真空总管 { var all=new List{new People{Id=1,Name=andy1,},new People{Id=2,Name=andy2,},new People{Id=3,Name=andy3,},new People{Id=4,Name=andy4,}; var someofm=newlist{new People{Id=1,Name=null,},new People{Id=2,Name=null,}; var测试=来自其中某些项目 在项目上的所有项目中加入元素。Id等于元素。Id 选择元素; 测试中的每个var项目 Console.WriteLine{0}={1},item.Id,item.Name; } } 公营阶层人士 { 公共整数Id { 收到 设置 } 公共字符串名 { 收到 设置 } } 代码版本将是

var test = someOfThem.Join(all, item => item.Id, element => element.Id, (item, element) => element);

如Robert的评论所示,您可以使用C的LINQ关键字,更具体地说,可以使用与之相关的join关键字:

使用制度; 使用System.Linq; 使用System.Collections.Generic; 公共课程 { 公共静态真空总管 { var all=new List{new People{Id=1,Name=andy1,},new People{Id=2,Name=andy2,},new People{Id=3,Name=andy3,},new People{Id=4,Name=andy4,}; var someofm=newlist{new People{Id=1,Name=null,},new People{Id=2,Name=null,}; var测试=来自其中某些项目 在项目上的所有项目中加入元素。Id等于元素。Id 选择元素; 测试中的每个var项目 Console.WriteLine{0}={1},item.Id,item.Name; } } 公营阶层人士 { 公共整数Id { 收到 设置 } 公共字符串名 { 收到 设置 } } 代码版本将是

var test = someOfThem.Join(all, item => item.Id, element => element.Id, (item, element) => element);
如Robert的评论所示,您可以在People类中实现Equals和GetHashCode,并使用Intersect

或者,创建一个EqualityComparer,这样比较逻辑就解耦了:

班级计划 { 公共静态真空总管 { var all=new List{new People{Id=1,Name=andy1,},new People{Id=2,Name=andy2,},new People{Id=3,Name=andy3,},new People{Id=4,Name=andy4,}; var someofm=newlist{new People{Id=1,Name=null,},new People{Id=2,Name=null,}; var test=all.intersectsomethem,new PeopleIdComparer.ToList; 测试中的每个var项目 Console.WriteLine{0}={1},item.Id,item.Name; } } 公共类PeopleId比较程序:IEqualityComparer { 公共学校等人x,等人y { 返回x.Id==y.Id; } 公共int GetHashCodePeople对象 { 返回HashCode.Combineobj.Id; } } 公营阶层人士 { 公共整数Id { 收到 设置 } 公共字符串名 { 收到 设置 } } 您可以在People类中实现Equals和GetHashCode,并使用Intersect

或者,创建一个EqualityComparer,这样比较逻辑就解耦了:

班级计划 { 公共静态真空总管 { var all=new List{new People{Id=1,Name=andy1,},new People{Id=2,Name=andy2,},new People{Id=3,Name=andy3,},new People{Id=4,Name=andy4,}; var SomeOmm=新 列表{newpeople{Id=1,Name=null,},newpeople{Id=2,Name=null,}; var test=all.intersectsomethem,new PeopleIdComparer.ToList; 测试中的每个var项目 Console.WriteLine{0}={1},item.Id,item.Name; } } 公共类PeopleId比较程序:IEqualityComparer { 公共学校等人x,等人y { 返回x.Id==y.Id; } 公共int GetHashCodePeople对象 { 返回HashCode.Combineobj.Id; } } 公营阶层人士 { 公共整数Id { 收到 设置 } 公共字符串名 { 收到 设置 } }
您可以使用Join,也可以使用字典,但我不打算展示:

以下是join的语法:

var test = someOfThem.Join(all, item => item.Id, element => element.Id, 
  (item, element) => new Person { 
    Id = item.Id ?? element.Id,
    Name = item.Name ?? element.Name,
    Age = item.Age ?? element.Age
  });

您可以使用Join,也可以使用字典,但我不打算展示:

以下是join的语法:

var test = someOfThem.Join(all, item => item.Id, element => element.Id, 
  (item, element) => new Person { 
    Id = item.Id ?? element.Id,
    Name = item.Name ?? element.Name,
    Age = item.Age ?? element.Age
  });


您有c.Id==c.Id,它将始终是true@Aggragoth,谢谢你指出,我已经改变了。同样在第二个代码块d:@agragoth,好的,全部完成。你有c.Id==c.Id,它将一直保持不变true@Aggragoth,谢谢你指出,我已经改变了。同样在第二个代码块d:@agragoth,好的,全部完成。谢谢你的回答,您能提供方法语法linq吗?var test=someOfM.Joinall,item=>item.Id,element=>element.Id,item,element=>element;很抱歉,起初我没有正确显示我的问题,我已更新了我的问题。请再看一次。我认为join不会起作用,因为join会选择一个列表或另一个列表,我想要的是将它们混合在一起。有什么帮助吗?谢谢你的回答,你能提供方法语法linq吗?var test=someof m.Joinall,item=>item.Id,element=>element.Id,item,element=>element;很抱歉,起初我没有正确显示我的问题,我已更新了我的问题。请再看一次。我认为join不会起作用,因为join会选择一个列表或另一个列表,我想要的是将它们混合在一起。有什么帮助吗?很抱歉,起初我没有正确地显示我的问题,我已经更新了我的问题。请再看一次。我认为join不会起作用,因为join会选择一个列表或另一个列表,我想要的是将它们混合在一起。有什么帮助吗?@AndySong更新了答案以适应您的新问题。这会比var test=someof更快吗。选择c=>{c.Name=all.Finda=>a.Id==c.Id.Name;返回c;};?是的,而且它不会改变原始集合。使用您所拥有的,尝试在之后转储其中的一些,您会注意到您已经修改了它。如果您知道每个属性的来源,也可以简化上述操作。我只是使用了空合并操作符,因为那时我不必在意,但是它稍微慢了一点-非常慢。很抱歉,我没有正确地显示我的问题,我已经更新了我的问题。请再看一次。我认为join不会起作用,因为join会选择一个列表或另一个列表,我想要的是将它们混合在一起。有什么帮助吗?@AndySong更新了答案以适应您的新问题。这会比var test=someof更快吗。选择c=>{c.Name=all.Finda=>a.Id==c.Id.Name;返回c;};?是的,而且它不会改变原始集合。使用您所拥有的,尝试在之后转储其中的一些,您会注意到您已经修改了它。如果您知道每个属性的来源,也可以简化上述操作。我只是使用了空合并操作符,因为我不必在意,但是它稍微慢一点——非常慢一点。