質問
次のようなforループがある場合:
For Each s As String In stringList
..do stuff..
Next
何らかの(非表示の)イテレーターがありますか、またはカウントを維持するために外部整数を追加する必要がありますか:
Dim i As Integer
For Each s As String In stringList
..do stuff..
i += 1
Next
解決
非表示のイテレータはありません。2番目の例のコードを使用するか、通常の for
ループに戻す必要があります。
他のヒント
foreachには別のカウンターは必要ありません。リスト内の各文字列を反復処理します(この例のstringListは、そのように聞こえます:))。何らかの理由がない限り、リスト内の各文字列に対して何かを行うことを停止したい(つまり、最初の3つの文字列のみを処理する)。それが、foreachループ内にカウンターを持つ唯一の理由です。 OPを読み直しました。もう1つの理由は、処理した文字列の数を知ることです。
これがお役に立てば幸いです! テレサ
非表示のイテレータはありません。
例の変数 i
は冗長です。
PS:何かを追跡するために i
が必要な場合は、 、依存する前に初期化します。
foreachループは、カウントを追跡する列挙子を使用して実装されます。何回ループしたかを知りたい場合は、forループを使用するか、カウントを自分で追跡する必要があります。
for-eachループは、列挙子を追跡します。
ForEach s As String In new string[] {"one","two","three"}
Console.WriteLine(s);
Next
(VBとC#の粗悪化については申し訳ありませんが、私は中括弧のような男です-おそらく擬似コードと考えるのが最善です)
上記のコードは出力されます
one
two
three
コンパイルする場合。 :)
間違いなく、独自の外部整数を提供する必要はありません。
それでも、隠されたカウンターはありません。非表示の列挙子があります。違いは、反復可能なすべての要素にインデックスでアクセスできるわけではないことです。前のアイテムを計算するまで、シーケンス内の次のアイテムを取得できない場合があります。そのため、列挙子は、カウンターを使用するのではなく、現在の位置を追跡し、ループの反復ごとに次のアイテムを返すステートマシンを使用する場合があります。
「For Each」の魔法の一部ループインクリメンタを自分で追跡する必要がないということです。それはあなたのために行われました。インターフェイス" IEnumerable"を参照するドキュメントを読むことができます。そして、" GetEnumerator()"を実装する必要があると言います。それは本当です。 GetEnumerator()関数はこの魔法を提供します。
それは正しいと思います。そうでなければ、誰かが私を修正すると確信しています。
エレガントなコードビューから、列挙子が.First()および.Last()メソッドで使用できると便利です。
Djangoバージョン1.0.2最終版...
列挙するには:
{% for item in items %}
<li>{{ forloop.counter }}) {{ item }}</li>
{% endfor %}
これを試して、ループ内の最初のアイテムに「ルール」を適用します。
{% if forloop.first %}Starting the loop{% endif %}
最後のアイテムを除外するにはこれを試してください:
{% if not forloop.last %}, {% endif %}
...最後の例は、コンマ区切りリストに最適です。