将列表合并为一个
本文关键字:一个 列表 合并 | 更新日期: 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
对象,那么有两种方法可以让事情工作。
-
如果可以依赖以相同顺序返回的相同数量的对象,则可以尝试:
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<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() 方法返回结果集列表。