[c#]为在多个列表中存在测试的 Linq 查询

标签: Linq C#
发布时间: 2017/2/28 22:37:43
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有类似于下面的数据结构

var blueList = new []
    {
        new { Id = 1, Value = 1000 }, 
        new { Id = 2, Value = 1300 }, 
        new { Id = 3, Value = 1500 },
        new { Id = 5, Value = 2100 }
    }.ToList();

var redList = new []
    {
        new { Id = 1, Value = 600 }, 
        new { Id = 3, Value = 950 }, 
        new { Id = 4, Value = 1100 },
        new { Id = 5, Value = 1300 }
    }.ToList();

var greenList = new []
    {
        new { Id = 1, Value = 50 }, 
        new { Id = 2, Value = 180 }, 
        new { Id = 3, Value = 270 },
        new { Id = 4, Value = 430 },
        new { Id = 5, Value = 510 }
    }.ToList();

var colourList = new [] { blueList, redList, greenList }.ToList();

ColourList 可以包含 abritrary 数目的元素,他们只是碰巧在此特定实例命名。

如何做构建一个 linq 查询,会给我一个新的列表只包含"Id"是的列表中的所有组?

以下结果排除 Id = 2,因为它不是在 redList 和 Id = 4,因为它不在 blueList。这是我所追求的。

var result = new []
    {
        new { Id = 1, Values = new [] { 1000, 600, 50 } },
        new { Id = 3, Values = new [] { 1500, 950, 270 } },
        new { Id = 5, Values = new [] { 2100, 1300, 510 } }
    };

有何建议?

解决方法 1:

方便︰

var query = 
    colourList
        .Select(xs => xs.Select(x => new
        {
            Id = x.Id,
            Values = Enumerable.Repeat(x.Value, 1),
        }))
        .Aggregate((xs, vs) =>
            from x in xs
            join v in vs on x.Id equals v.Id
            select new
            {
                Id = x.Id,
                Values = x.Values.Concat(v.Values),
            });

在您的示例数据得到如下结果︰

result

当然你可以扩展 colorList ,包含尽可能多的子表,如你所愿。

官方微信
官方QQ群
31647020