将列表合并为一个

本文关键字:一个 列表 合并 | 更新日期: 2023-09-27 18:35:13

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

C# Joins/Where with Linq 和 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 "山姆""

2 "开发""

4 "哼"

我有另一种方法,如下所示

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

这将给我以下人员列表

1 " "ABC"

6 " "TTT"

2 " "XYZ"

现在我需要合并两个方法的结果,以便我可以像这样获得最终结果

1 "山姆"ABC"

2 "开发"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<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 }; });

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