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

您可以使用Enumerable.All检查 List 中的所有项目是否满足条件。

在这种情况下,类似

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

顺便说一句,在你的例子中,你有(if item = 0),这应该是if (item == 0)

于 2012-09-25T17:03:28.023 回答
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 回答
1

你目前拥有的东西是完全可以接受的。我一直使用这种模式。

我建议的一件事是,count除非boolcount 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 / 便利函数对列表进行操作只会花费您一个布尔值,并且您只需遍历您的列表一次。

于 2012-09-25T17:03:29.393 回答