将列表合并为一个
我看到下面的post对我来说真的很难理解。 所以我重新发布它。 对不起,如果有人认为它是重复的。 我只有简单的要求
C#加入/ Linq和Lambda的位置
我有这样的课
public class Person { public int Id{get;set;} public string Name{get;set;} public string MailingAddress{get;set;} }
我有一个像下面这样的方法
public IList GetNames(IList ids)
这将给我下面的人员名单
1“Sam”“”
2“开发”“”
4“哈希”
我有另一种方法,如下所示
public IList GetMailingAddress(IList ids)
这将给我下面的人员名单
1“”“ABC”
6“”“TTT”
2“”“XYZ”
现在我需要合并两个方法的结果,这样我才能得到这样的最终结果
1“Sam”“ABC”
2“Dev”“XYZ”
更新:对不起,我没有明确提供我的测试数据。 请参阅上面的测试数据
我对你的方法返回的内容感到有些困惑,如果你需要将两个结果组合起来获得完整的Person
对象,那么有两种方法可以让你的方法运行起来。
-
如果您可以依赖于以相同顺序返回的相同数量的对象,则可以尝试:
names.Zip(mailingAddresses, (n, m) => new Person { Id = n.Id, Name = n.Name, MailingAddress = m.MailingAddress });
-
如果您不能依赖这两个条件,则可以使用
Join
:names.Join(mailingAddresses, n => n.Id, m => m.Id, (n, m) => new Person { Id = n.Id, Name = n.Name, MailingAddress = m.MailingAddress });
即使您有这两个选项,如果您可以控制实际从数据源获取对象的代码,那么还有第三个更好的选择。 如果您知道需要这两个数据,则应创建一个方法,一次查询数据源以获取所有数据,而不是每个数据查询一次。
Enumerable.Zip绝对会解决您的问题。
你可以使用Enumerable.Zip解决它并在以下方面订购数据:
IEnumerable list = GetNames(new List()).OrderBy(p => p.Id).Zip(GetMainlingAddress(new List ()).OrderBy(p => p.Id), (first, second) => { return new Person() { Id = first.Id, Name = first.Name, MailingAddress = second.MailingAddress }; });
对通过Lambda样式Linq语法返回值的这两个方法执行连接:
var query = GetNames().Join(GetMailingAddress(), n => n.Id, e => e.Id, (n, e) => new { n.Id,n.Name,e.Email}); foreach (var item in query) { Console.WriteLine(item.Id + "-" + item.Name +"-"+ item.Email); }
对通过Sql样式的Linq语法返回值的这两个方法执行连接:
var query = from n in GetNames() join e in GetMailingAddress() on n.Id equals e.Id select new {n.Id,n.Name,e.Email }; foreach (var item in query) { Console.WriteLine(item.Id + "-" + item.Name +"-"+ item.Email); }
注意:GetName()和GetMailingAddress()方法返回结果集的列表。
上述就是C#学习教程:将列表合并为一个分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/988588.html