C# 在捕获索引时使用LINQ展平列表
我有一个C# 在捕获索引时使用LINQ展平列表,c#,.net,linq,indexing,flatten,C#,.net,Linq,Indexing,Flatten,我有一个列表,我想把它展平到列表,其中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")}}} 我可能会得到Ndx为0表示“a”、“b”和“c”,1
列表
,我想把它展平到列表
,其中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")}}}
我可能会得到Ndx为0表示“a”、“b”和“c”,1表示“x”和“y”。有人有LINQ解决方案吗?有点烦琐,但您可以这样做:
IEnumerable<Tuple<Foo,int>> result =
tree.SelectMany(
(L1,i) => L1.SelectMany(
L2 => L2.Select(
k => Tuple.Create(k,i)
)
)
);
IEnumerable结果=
tree.SelectMany(
(L1,i)=>L1.SelectMany(
L2=>L2。选择(
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);
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
福班
{
公共字符串s;
公共Foo(字符串s)
{
这个.s=s;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
变量树=新列表
{
新名单
{
新名单{new Foo(“a”)、new Foo(“b”)},
新列表{newfoo(“c”)}
},
新名单
{
新列表{new Foo(“x”)、new Foo(“y”)}
}
};
IEnumerable result=tree.SelectMany((L1,i)=>L1.SelectMany(L2=>L2.Select(k=>Tuple.Create(k,i)));
foreach(结果中的var si)
{
控制台写入线(si.Item1.s+''+si.Item2);
}
}
}
编辑:正如@sll所指出的,由于使用了Tuple
,此解决方案需要.NET4。如果有必要的话,适应也不会太难。这应该可以做到:
var l = 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")}}};
var q = l.SelectMany ((x, i) =>
x.SelectMany (y =>
y.Select (z => new { z, i })));
var l=新列表(){
新名单(){
新列表(){new Foo(“a”)、new Foo(“b”)},
新列表(){new Foo(“c”)},
新名单(){
新列表(){new Foo(“x”),new Foo(“y”)}};
var q=l.SelectMany((x,i)=>
x、 选择多(y=>
y、 选择(z=>new{z,i}));
“我有一份清单”。。。哇,肯定有更好的结构吗?@恶心:恶心只是你的名字还是你的意见@StuartGolodetz实际上是我的名字;我的父母非常残忍。顺便说一句,这并不是粗鲁的意思-只是被你对数据结构表示厌恶的事实所震惊,然后用“-uck”:)最后的结果集中应该有多少项?@sll:很公平。我承认我一直都是C++程序员(今年早些时候我就用C语言开始),所以最近的.NET中新的或不新的东西在我身上已经有些失去了。