0

さて、アイテムの可変リストがあるとしましょう。アイテムの数に制限はありません。各アイテムはどちらでもかまいません0,1,2,3, or 4。だから私はループを作ります。

foreach(item in allitems)
{
    if (item == 0) continue;
    do stuff for items 1-4.
}

通過するすべての項目が 0 であるとしましょう。この場合、特定のコード行を実行したい場合はどうすればよいでしょうか。もちろん、私は次のようなことをすることができます

int count = 0
foreach(item in allitems)
{
    if (item == 0) {count++; continue;}
    do stuff for items 1-4.
}
if(count == allitems.Count())
{
    do stuff
}

しかし、私はいつもカウント変数を使ってこのようなことをするのは安いと感じていました。ソリューションを一緒にダクトテープで貼り付けるような気がしないことで、私にできることはありますか?

4

4 に答える 4

3

ここでカウントを使用する必要はありません。チェックではなく、チェックを通過した場合に設定されるフラグを保持するだけです。

bool anyNonZeroItems = false;
foreach(item in allitems)
{
    if (item == 0)
    {
        continue;
    }
    anyNonZeroItems = true;
    // Whatever else
}
if (!anyNonZeroItems)
{
    // Everything was 0 (or the collection was empty)
}
于 2012-09-25T17:08:12.203 に答える
3

Enumerable.Allを使用して、リスト内のすべての項目が条件を満たすかどうかを確認できます。

この場合、次のようなもの

if (allItems.All(i => i == 0) {
   //do stuff
}

ちなみにあなたの例では(if item = 0)、これはそうあるべきですif (item == 0)

于 2012-09-25T17:03:28.023 に答える
1

あなたが現在持っているものは完全に受け入れられます。私はいつもそのようなパターンを使用しています。

私が提案することの 1 つはcountboolcount count == 11 and> 1`

于 2012-09-25T17:03:27.933 に答える
1

これはかなり一般的な問題ですが、あなたは奇妙な解決策を提案しています。状態を示すためにブール値を使用しないのはなぜですか?

bool branchExecuted = false;
foreach(item in allitems)
{
    if (item == 0)
    {
      branchExecuted = true; 
      continue;
    }
    //do stuff for items 1-4.
}

if(!branchExecuted)
{
    //do stuff if we never hit that line
}

LINQ /便利な関数の代わりにこれを使用してリストを操作すると、ブール値が1つだけかかり、リストを1回繰り返すだけで済みます。

于 2012-09-25T17:03:29.393 に答える