将对象集合中的每个元素与LINQ中的对象本身组合在一起

时间:2014-06-25 13:41:49

标签: c# linq

class C
{
    public int Value;
    public int[] Items;
}

var data = new C[] { new C() { Value = 1, Items = new int[] { 1, 2, 3 } },
                            new C() { Value = 10, Items = new int[] { 10, 20, 30 } } };

我想在数据中为每个C实例组合Value和每个Item的值,因此结果应该是{1,1}, {1,2}, {1,3}, {10,10}, {10,20}, {10,30}的元组

我已经有了程序解决方案:

var list = new List<Tuple<int, int>>();
foreach (var c in data)
    foreach (var item in c.Items)
        list.Add(Tuple.Create(c.Value, item));

但我想知道如何在LINQ中写这个。

4 个答案:

答案 0 :(得分:2)

这样的东西?

var list = 
    (from c in data
    from item in c.Items
    select Tuple.Create(c.Value, item)).ToList();

答案 1 :(得分:1)

您可以根据每个项目及其值创建Tuple,然后使用SelectMany将其展平为:

List<Tuple<int, int>> list = data.Select(mainItem => mainItem.Items
                                .Select(item =>
                                        Tuple.Create(mainItem.Value, item)))
                                 .SelectMany(r => r)
                                 .ToList();

你会得到:

enter image description here

答案 2 :(得分:1)

使用SelectMany的这个重载得到它 - 代码改编自the documentation中的示例:

  var result = data.SelectMany(p=>p.Items,(p,item)=>new {Value=p.Value,Item=item});

答案 3 :(得分:0)

使用工厂Func选择用于创建元组的

List<Tuple<int, int>> flattenedDataList = data
            .SelectMany(c => c.Items, (c, i) => Tuple.Create(c.Value, i))
            .ToList();