首页 > 解决方案 > 加入多个列表并以逗号分隔的字符串形式获取输出

问题描述

我有以下 2 个列表作为输入,我想实现下面提到的输出。

var T1 = new []
{
    new { tid = 1, status = "P", qty = 2, itemid = 7, itemseq = 1, },
    new { tid = 1, status = "P", qty = 3, itemid = 7, itemseq = 2, },
    new { tid = 1, status = "R", qty = -3, itemid = 7, itemseq = 1, },
};

var T2 = new []
{
    new { itemid = 7, itemseq = 1, itemname = "abc", itemdesc = "xyz", },
    new { itemid = 7, itemseq = 2, itemname = "aaa", itemdesc = "ddd", },
};

期望的输出

tid      desc1(Status P)              desc2 (Status R)
1    abc - xyx (2), aaa - ddd (3)     abc - xyz (-3)

到目前为止,我可以加入 2 个列表并使用 LINQ 获取以下数据

var Data = (from ti in T1
            join iv in T2 on new { ti.itemid, ti.itemseq } equals new { iv.itemid,iv.itemseq}
            select new
            {
                tid = ti.tid,
                status = ti.status,
                Desc = $"{iv.itemname} - {iv.itemdesc} ( {ti.qty} )"
             }).ToList();

o/p:

tid status  Desc
1    P      abc - xyx (2)
1    P      aaa - ddd (3)
1    R      abc - xyz (-3)

有什么方法可以用最少的代码行实现所需的输出?

标签: c#listlinq

解决方案


试一试:

var Data =
(
    from ti in T1
    join iv in T2 on new { ti.itemid, ti.itemseq } equals new { iv.itemid,iv.itemseq}
    group new { iv.itemname, iv.itemdesc, ti.status, ti.qty } by ti.tid into gs
    let lookup = gs.ToLookup(x => x.status)
    select new
    {
        tid = gs.Key,
        desc1 = String.Join(", ", lookup["P"].Select(x => $"{x.itemname} - {x.itemdesc} ({x.qty})")),
        desc2 = String.Join(", ", lookup["R"].Select(x => $"{x.itemname} - {x.itemdesc} ({x.qty})")),
     }
).ToList();

我得到:

数据


推荐阅读