我有一个IEnumerable<string
> 我想将其分成三组,因此如果我的输入有 6 个项目,我会得到一个IEnumerable<IEnumerable<string>>
返回两个项目,每个项目包含一个IEnumerable<string>
我的字符串内容在其中。
我正在寻找如何使用 Linq 而不是简单的 for 循环来做到这一点
Thanks
这是对该线程的较晚回复,但这里有一个不使用任何临时存储的方法:
public static class EnumerableExt
{
public static IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> input, int blockSize)
{
var enumerator = input.GetEnumerator();
while (enumerator.MoveNext())
{
yield return nextPartition(enumerator, blockSize);
}
}
private static IEnumerable<T> nextPartition<T>(IEnumerator<T> enumerator, int blockSize)
{
do
{
yield return enumerator.Current;
}
while (--blockSize > 0 && enumerator.MoveNext());
}
}
以及一些测试代码:
class Program
{
static void Main(string[] args)
{
var someNumbers = Enumerable.Range(0, 10000);
foreach (var block in someNumbers.Partition(100))
{
Console.WriteLine("\nStart of block.");
foreach (int number in block)
{
Console.Write(number);
Console.Write(" ");
}
}
Console.WriteLine("\nDone.");
Console.ReadLine();
}
}
但是,请注意以下有关此方法的局限性的评论:
-
如果您更改foreach
在测试代码中foreach (var block in someNumbers.Partition(100).ToArray())
那么它就不再起作用了。
-
它不是线程安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)