我有一个List<List<List<Foo>>>
,我想将其展平为List<new {Foo, Ndx}>
,其中Ndx是最外层列表的索引。例如,如果我有类似的东西:
new List(){
new List(){
new List(){ new Foo("a"), new Foo("b")},
new List(){ new Foo("c")}},
new List(){
new List(){ new Foo("x"), new Foo("y")}}}
我可能会以“ a”,“ b”和“ c”的Ndx最终为0以及“ x”和“ y”的Ndx最终为1。有人有LINQ解决方案吗?
最佳答案
有点儿怪异,但您可以这样做:
IEnumerable<Tuple<Foo,int>> result =
tree.SelectMany(
(L1,i) => L1.SelectMany(
L2 => L2.Select(
k => Tuple.Create(k,i)
)
)
);
编译版本为:
using System;
using System.Collections.Generic;
using System.Linq;
class Foo
{
public string s;
public Foo(string s)
{
this.s = s;
}
}
class Program
{
static void Main(string[] args)
{
var tree = new List<List<List<Foo>>>
{
new List<List<Foo>>
{
new List<Foo> { new Foo("a"), new Foo("b") },
new List<Foo> { new Foo("c") }
},
new List<List<Foo>>
{
new List<Foo> { new Foo("x"), new Foo("y") }
}
};
IEnumerable<Tuple<Foo,int>> result = tree.SelectMany((L1,i) => L1.SelectMany(L2 => L2.Select(k => Tuple.Create(k,i))));
foreach(var si in result)
{
Console.WriteLine(si.Item1.s + ' ' + si.Item2);
}
}
}
编辑:正如@sll指出的,由于使用
Tuple
,此解决方案需要.NET 4。如有必要,适应起来并不难。