Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在捕获索引时使用LINQ展平列表_C#_.net_Linq_Indexing_Flatten - Fatal编程技术网

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中新的或不新的东西在我身上已经有些失去了。