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中写这个。
答案 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();
你会得到:
答案 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();