static IEnumerable<int> LuckyNumbers()
{
IEnumerable<int> luckyNumbers = Enumerable.Range(1, int.MaxValue);
int counter = 1;
while (true)
{
int number = luckyNumbers.ElementAt(counter++);
yield return number;
luckyNumbers = luckyNumbers.Where((_, index) => (index + 1) % number != 0);
}
}
、
lucky numbersを生成する関数を記述しようとしていますが、これは生成:幸運の数字ではありません
2,5,7,11,13,17,21,...
を。
なぜ私のコードは機能しませんか?すべての自然数と
開始:私がしようとしていますそれらを介して
IEnumerable<int> luckyNumbers = Enumerable.Range(1, int.MaxValue); int counter = 1;
反復処理し、次のラッキーナンバーを返す:
while (true) { int number = luckyNumbers.ElementAt(counter++); yield return number;
をすべて
n
番目の番号を削除配列から:luckyNumbers = luckyNumbers.Where((_, index) => (index + 1) % number != 0);
これは私が意図したとおりに動作しない理由はわかりません。
ステップ3を実行するたびに、新しいシーケンスが作成されることに注意してください。さて、あなたはその新しいシーケンスから要素の 'counter'を欲しいと確信していますか?紙の上でそれをすべて試してみてください... –
@JonSkeet私は確信しています、私は毎回前の世代の次の要素を取ることを意味していると思っています。しかし私は紙でそれを試すことができます。 – theonlygusti
wikipediaには実例がありますので、デバッグ中はそれに従うことをお勧めします。最初の問題は、 'counter = 0'ではなく' counter = 1'を得ているので、2番目の要素から始めていることです。つまり、1を返すことは決してありません.1は幸運な数字です。 –