2012-09-25 17 views
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 
} 

但我總是覺得便宜,使用計數變量做這樣的事情。有沒有什麼我可以做的事情,不喜歡一起解決一個解決方案?

回答

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) 
} 
+0

雖然我覺得像一個暴發糾正喬恩Skeet :-)問題是檢查時,所有項目匹配的值不是當任何項目匹配的值... –

+0

哦,等待 - 我是一個白癡暴發戶或做邏輯反向我最後一次看到這個? <恥辱/> –

+1

@ PaulD'Ambra :(編輯過我已經看到了新的評論。)不,我不認爲它改變了...... –

3

您可以使用Enumerable.All來檢查列表中的所有項目是否滿足條件。

在這種情況下,一些

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

順便說一下你的榜樣,你有(if item = 0)這應該是if (item == 0)

+0

雖然這是一個非常有效的建議,我希望OP能夠以此爲例解決更大的問題。使用這個而不是使用狀態布爾值的唯一問題是你必須枚舉兩次列表。 –

+0

true,但要小心不成熟的優化:-)在這種情況下,列表中有5個整數並列舉一次或兩次將會忽略不計......即使列出了大量整數,您也很難看出明顯的差異。但你完全正確,這取決於真正的問題! –

+1

我想我們應該記住全部的引用:「我們應該忘記小效率,大約97%的時間:過早優化是萬惡之源的根源,但我們不應該在這個關鍵的3%中放棄我們的機會。」我會說一個布爾與一個複雜的函數可能在3%:) –

1

什麼你現在已經是完全可以接受的。我總是使用這種模式。

有一件事我會建議正在countbool除非有當count == 11 and計數> 1`

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 /便利功能的列表進行操作只會花費你一個布爾值,你只需要遍歷列表一次。

+0

這設置狀態標誌,如果任何項目是0,而不是所有值都是0 –

+0

你知道,他的例子說你是正確的。但他的頭銜推斷了別的東西。標題說「如果這行代碼從未執行,請執行某些操作」。他的解決方案實際上解決了這個問題,但以相反的方式,我想到了這一點,它會將「特殊」代碼放在分支中,並將正常代碼放在循環的基本範圍內。 –

+0

是的,問題是細節上的一點點,所以我想我們只是想象爲什麼我們會這樣做並解決這個問題......特別是基於一天的時間。 –

相關問題