繁体   English   中英

加入两个不同对象的列表并创建一个新列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM