[英]Join two lists of different objects and create a new list
我有两个不同对象的列表。
List<ObjA> objAs = new List<ObjA>();
List<ObjB> objBs = new List<ObjB>();
它们具有以下 class 结构。
public class ObjA
{
public int Id;
public int ObjBId;
}
public class ObjB
{
public int Id;
public string Title;
}
将 objA 的ObjBId
属性加入到 ObjB 的Id
属性中,我想在 ObjB 的标题旁边创建一个 ObjA 的 Id 列表。 像这样的东西:
List<int, string> output = new List<int, string>();
// where int = ObjA's Id, string = ObjB's Title
如何在 LINQ 中做到这一点? 除了使用 Concat 和创建包装器 class 之外,还有其他选择吗?
Enumerable.Join
应该可以帮助你。
var result = objAs.Join(objBs,x=>x.ObjBId,y=>y.Id,(x,y)=>new {x.Id,y.Title})
.ToList();
您可以使用Join
方法并将结果作为命名元组List<(int, string)>
的列表返回(从 C# 7 开始可用),因为List<int, string>
不是有效的 C# 声明。
var output = objAs.Join(objBs, a => a.ObjBId, b => b.Id, (a, b) => (a.Id, b.Title)).ToList();
您也可以使用匿名对象代替元组,例如(a, b) => new { a.Id, b.Title}
您可以使用连接并返回列表
var result = (from a in objAs
join b in objBs on a.ObjBId equals b.Id
select new
{
a.ObjBId,
b.Title
}).ToList();
因此,对于 objAs 的每个元素,您都需要获取 Id,如果 objBs 中存在具有相同 Id 的 object,则需要来自 objA 的 Id 和来自 objB 的标题。
事实上,由于 objA 和 objB 的 Id 是相等的,所以你不管是从 objA 还是从 objB 获取 Id。
如果 objB 中没有具有相同 ID 的项目,则您没有写出您想要的内容。 假设在这种情况下您想要 null。
var result = objAs.GroupJoin(objBs, // GroupJoin A with B
objA => objA.Id, // from every element in A take the Id
objB => objB.Id, // from every element in B take the Id
// ResultSelector: take all elements of A, each with the matching elements from B
(objA, matchingObjBs) => new
{
Id = objA.Id,
Title = matchingObjBs.Select(objB => objB.Title).FirstOrDefault(),
});
GroupJoin 的好处在于,您还可以从 A 中获取没有匹配 B 的元素。如果 B 中有多个匹配项,则取第一个。
如果您不希望 A 中的项目在 B 中没有匹配的 Id,则仅从 B 中获取在 A 中具有 Id 的元素就足够了:
var idsA = objAs.Select(objA => objA.Id);
var result = objBs.Where(objB => idsA.Contains(objB.Id));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.