将列表合并为一个

我看到下面的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对象,那么有两种方法可以让你的方法运行起来。

  1. 如果您可以依赖于以相同顺序返回的相同数量的对象,则可以尝试:

     names.Zip(mailingAddresses, (n, m) => new Person { Id = n.Id, Name = n.Name, MailingAddress = m.MailingAddress }); 
  2. 如果您不能依赖这两个条件,则可以使用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()方法返回结果集的列表。