将列表合并为一个

时间:2014-12-23 21:59:17

标签: c# linq list lambda merge

我看到下面的帖子对我来说真的很难理解。所以我重新发布它。对不起,如果有人认为它是重复的。我只有简单的要求

C# Joins/Where with Linq and Lambda

我有一个这样的课程

public class Person
{
  public int Id{get;set;}
  public string Name{get;set;}
  public string MailingAddress{get;set;}
}

我有一个类似下面的方法

public IList<Person> GetNames(IList<int> ids)

这将为我提供以下人员名单

1“Sam”“”

2“Dev”“”

4“Hummy”

我有另一种方法,如下面的

 public IList<Person> GetMailingAddress(IList<int> ids)

这将为我提供以下人员名单

1“”“ABC”

6“”“TTT”

2“”“XYZ”

现在我需要合并两种方法的结果,这样我才能得到像我这样的最终结果

1“Sam”“ABC”

2“Dev”“XYZ”

更新:对不起,我没有明确提供测试数据。请参阅上面的测试数据

4 个答案:

答案 0 :(得分:5)

我对你的方法返回的内容感到有些困惑,如果你需要将两个结果组合起来获得完整的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
    });
    
  3. 即使您有这两个选项,如果您可以控制实际从数据源获取对象的代码,那么第三个也是更好的选择。如果您知道需要这两个数据,则应创建一个方法,一次查询数据源以获取所有数据,而不是每个数据查询一次。

答案 1 :(得分:1)

Enumerable.Zip肯定会解决您的问题。

答案 2 :(得分:0)

您可以使用Enumerable.Zip和之前订购数据来解决此问题:

IEnumerable<Person> list = GetNames(new List<int>()).OrderBy(p => p.Id).Zip(GetMainlingAddress(new List<int>()).OrderBy(p => p.Id), (first, second) => { return new Person() { Id = first.Id, Name = first.Name, MailingAddress = second.MailingAddress }; });

答案 3 :(得分:0)

对通过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()方法返回结果集列表。