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以列主格式将IEnumerable组织成批?_C#_Linq - Fatal编程技术网

C# 是否有一种方法可以使用Linq以列主格式将IEnumerable组织成批?

C# 是否有一种方法可以使用Linq以列主格式将IEnumerable组织成批?,c#,linq,C#,Linq,在我最近的几个项目中,我发现需要将单个集合划分为m批n元素 有一个答案建议使用morelinq的Batch方法。这是我首选的解决方案(无需重新发明轮子等) 当Batch方法以行主格式将输入向上划分时,是否也可以编写类似的扩展以列主格式将输入向上划分?也就是说,给定输入 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } 您可以调用ColumnBatch(4),生成 { { 1, 4, 7, 10 }, { 2, 5, 8, 11 }, {

在我最近的几个项目中,我发现需要将单个集合划分为
m
n
元素

有一个答案建议使用morelinq的
Batch
方法。这是我首选的解决方案(无需重新发明轮子等)

Batch
方法以行主格式将输入向上划分时,是否也可以编写类似的扩展以列主格式将输入向上划分?也就是说,给定输入

{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }
您可以调用
ColumnBatch(4)
,生成

{
    { 1, 4, 7, 10 },
    { 2, 5, 8, 11 },
    { 3, 6, 9, 12 }
}
莫林克已经提供类似的服务了吗

更新:我将稍微改变一下惯例。我将不使用
4
的输入,而是将其更改为
3
(批数而不是批大小)

最终的扩展方法将具有签名

public static IEnumerable<IEnumerable<T>> ToColumns<T>(this IEnumerable<T> source, int numberOfColumns)
公共静态IEnumerable to列(此IEnumerable源,int numberOfColumns)

实现该方法的人应该清楚,并且不需要多次枚举。

这意味着您必须具体化整个枚举或多次枚举。不管怎样,使用枚举似乎是一件奇怪的事情,并没有那么奇怪。Fortran是基于列主格式构建的。我怀疑Fortran是否有.NET IEnumerable、yield和延迟执行的概念。它在任何物化类型(如数组)上都能很好地工作,但在基本IEnumerable上,它会很奇怪,因为它会多次枚举和/或物化它。也许如果我改变惯例,让3的输入生成相同的输出,这将避免多次枚举。
实现方法的人应该清楚这一点,并且不需要多次枚举。
如果不多次迭代源代码,或者在生成任何项之前将整个查询具体化为单个集合,则不可能解决此问题(以便该集合可以多次迭代).现在在数组的末尾加上13,然后看这段休息。这就是为什么你不应该使用幻数。+1,我更喜欢这个解决方案,除了闭包,但在这个例子中它是可以的case@L.B然后加上13、14、15、16,仍然看着它破裂。这里硬编码的
3
是错误的。@Servy我认为OP可以理解答案中的意思。所以显然你没有请注意,只要它对提供的单个示例有效,它就不会解决问题。它对任何其他示例无效是无关紧要的。
int[] arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int i=0;
var result = arr.GroupBy(x => i++ % 3).Select(g => g.ToList()).ToList();