コンテキスト: C# 3.0、.Net 3.5
(永久に) 乱数を生成するメソッドがあるとします。
private static IEnumerable<int> RandomNumberGenerator() {
while (true) yield return GenerateRandomNumber(0, 100);
}
これらの数字を 10 ごとにグループ化する必要があるため、次のようにします。
foreach (IEnumerable<int> group in RandomNumberGenerator().Slice(10)) {
Assert.That(group.Count() == 10);
}
Slice メソッドを定義しましたが、すでに定義されているはずです。参考までに、Slice メソッドを次に示します。
private static IEnumerable<T[]> Slice<T>(IEnumerable<T> enumerable, int size) {
var result = new List<T>(size);
foreach (var item in enumerable) {
result.Add(item);
if (result.Count == size) {
yield return result.ToArray();
result.Clear();
}
}
}
質問:私がやろうとしていることを達成するためのより簡単な方法はありますか? おそらくLinq?
注: 上記の例は簡略化したものです。私のプログラムでは、特定の行列を非線形にスキャンする Iterator を使用しています。
編集:Skip
+Take
がダメな 理由。
効果的に私が欲しいのは:
var group1 = RandomNumberGenerator().Skip(0).Take(10);
var group2 = RandomNumberGenerator().Skip(10).Take(10);
var group3 = RandomNumberGenerator().Skip(20).Take(10);
var group4 = RandomNumberGenerator().Skip(30).Take(10);
number (10+20+30+40) 回再生成するオーバーヘッドはありません。正確に 40 個の数字を生成し、4 つのグループの数字を 10 で割るソリューションが必要です。