Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#_Linq - Fatal编程技术网

C# 如何使用LINQ划分子列表?

C# 如何使用LINQ划分子列表?,c#,linq,C#,Linq,可能重复: 我正在寻找使用LINQ将一个可枚举项拆分为三个可枚举项的方法,这样输入中的每个后续项都位于序列中的下一个子列表中。所以输入 {"a", "b", "c", "d", "e", "f", "g", "h"} 会导致 {"a", "d", "g"}, {"b", "e", "h"}, {"c", "f"} 我是这样做的,但我相信一定有一种方法可以用LINQ更优雅地表达这一点 var input = new List<string> {"a", "b", "c", "d"

可能重复:

我正在寻找使用LINQ将一个可枚举项拆分为三个可枚举项的方法,这样输入中的每个后续项都位于序列中的下一个子列表中。所以输入

{"a", "b", "c", "d", "e", "f", "g", "h"}
会导致

{"a", "d", "g"}, {"b", "e", "h"}, {"c", "f"}
我是这样做的,但我相信一定有一种方法可以用LINQ更优雅地表达这一点

var input = new List<string> {"a", "b", "c", "d", "e", "f", "g", "h"};
var list = new List<string>[3];

for (int i = 0; i < list.Length; i++)
    list[i] = new List<string>();

int column = 0;
foreach (string letter in input)
{
    list[column++].Add(letter);
    if (column > 2) column = 0;
}
var input=新列表{“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”};
var列表=新列表[3];
for(int i=0;i2)列=0;
}

这就是您要寻找的: (按列拆分)根据以前的帖子修改

关键的区别在于分组方式,使用mod而不是division

此外,我还将其设置为泛型,以便返回正确的类型(与“对象类型”代码相反)。您可以只对泛型使用类型推断

public static IEnumerable<IEnumerable<T>> SplitColumn<T>( IEnumerable<T> source ) {
    return source
        .Select( ( x, i ) => new { Index = i, Value = x } )
        .GroupBy( x => x.Index % 3 )
        .Select( x => x.Select( v => v.Value ).ToList() )
        .ToList();
}
公共静态IEnumerable拆分列(IEnumerable源){
返回源
.Select((x,i)=>new{Index=i,Value=x})
.GroupBy(x=>x.索引%3)
.Select(x=>x.Select(v=>v.Value).ToList())
.ToList();
}

这就是您要寻找的: (按列拆分)根据以前的帖子修改

关键的区别在于分组方式,使用mod而不是division

此外,我还将其设置为泛型,以便返回正确的类型(与“对象类型”代码相反)。您可以只对泛型使用类型推断

public static IEnumerable<IEnumerable<T>> SplitColumn<T>( IEnumerable<T> source ) {
    return source
        .Select( ( x, i ) => new { Index = i, Value = x } )
        .GroupBy( x => x.Index % 3 )
        .Select( x => x.Select( v => v.Value ).ToList() )
        .ToList();
}
公共静态IEnumerable拆分列(IEnumerable源){
返回源
.Select((x,i)=>new{Index=i,Value=x})
.GroupBy(x=>x.索引%3)
.Select(x=>x.Select(v=>v.Value).ToList())
.ToList();
}

检查此链接,请不要编辑自动输入的重复问题链接。它是自动的,如果问题再次出现,系统将无法删除它。而是在自动插入的清晰标记指示器下方进行更改。检查此链接,请不要编辑自动输入的重复问题链接。它是自动的,如果问题再次出现,系统将无法删除它。我确实看到了这个问题,但它要求每个子列表都是顺序的,所以我忽略了它。奇怪的是,当它正确地解决了我的问题时,这是一个被接受的答案,而不是在那个问题中提出的答案。@SteveCrane我只是在想,我是否可以让它更具可重用性。通常如何指定拆分大小?(每个子列表的项目数,或者子列表的数量?)如果你想让它成为一个可重用的函数,那么子列表(列)的数量就是你想要的。看来我上面的评论是错的。由于这个问题是以重复的形式结束的,我重新审视了这两个问题,并意识到在可接受的解决方案中存在着细微的差异,导致结果的顺序不同。我确实看到了这个问题,但它要求每个子列表都是顺序的,所以我忽略了它。奇怪的是,当它正确地解决了我的问题时,这是一个被接受的答案,而不是在那个问题中提出的答案。@SteveCrane我只是在想,我是否可以让它更具可重用性。通常如何指定拆分大小?(每个子列表的项目数,或者子列表的数量?)如果你想让它成为一个可重用的函数,那么子列表(列)的数量就是你想要的。看来我上面的评论是错的。因为这个问题是重复的,所以我重新审视了这两个问题,并意识到在可接受的解决方案中存在着细微的差异,导致了不同顺序的结果。