2010-09-01 145 views
3

我目前正在用大約5個嵌套if語句掙扎,並且它變得相當困惑以查看所有這些語句。三元運算符在foreach

於是,我想到了將三元運營商,而不是IFS爲簡單的檢查,看

foreach (String control in controls) 
{ 
if (!control.Equals(String.Empty)) 
{ 
    // Do some stuff 
    foreach (Int32 someStuff in moreStuff) 
    { 
    if (!someStuff.Equals(0)) 
    { 
    // More stuff with more if equals 
    } 
    } 
} 

這就是它的外觀像現在。這就是我如何使它看起來想法一點點更漂亮:

foreach (String control in controls) 
{ 
(control.Equals(String.Empty)) ? continue : null; 
// Do some stuff 
foreach (Int32 someStuff in moreStuff) 
{ 
    (someStuff.Equals(0)) ? continue : null; 
    // More stuff 
} 
} 

所以,問題是:1,是不好的編程來解決它像這樣和2將它的工作就是我想要的?

+2

那會編譯嗎?據我所知,「:」的左右兩邊都必須是一個值。 (三元運算符返回一個值)。 – 2010-09-01 09:02:19

+0

它看起來不像三元運算符可以幫助你在可讀性和功能性方面。如果您需要5 lvls deep'foreach',那麼我認爲您可能需要重新考慮您的功能 – Stefanvds 2010-09-01 09:13:31

+0

爲什麼不寫「如果!...繼續」?它實際上比你的例子更短,很明顯,最好 - 它的工作原理。 – greenoldman 2010-09-01 10:19:43

回答

3

你爲什麼不做下面的事情?

foreach (String control in controls) 
{ 
if(control.Equals(String.Empty)) 
     continue; 
// Do some stuff 
foreach (Int32 someStuff in moreStuff) 
{ 
    if(someStuff.Equals(0)) 
     continue; 
    // More stuff 
} 
} 

恕我直言,它的方式更容易閱讀:)

2

不,不會在所有的工作。條件運算符不會讓您像那樣更改流量控制 - 它只是根據第一個表達式計算第二個或第三個表達式。條件表達式的結果是評估的任何表達式的結果(應用了任何必需的轉換之後)。

LINQ很可能會讓你的生活在這裏變得相當容易,儘管你需要給出一個更完整的例子來說明你想要做的事情以便清楚說明。

編輯:只是爲了給Dave的答案替代:

var query = from control in controls 
      where control != "" 
      from someStuff in moreStuff 
      where someStuff != 0 
      select new { control, someStuff }; 

foreach (var result in query) 
{ 
    // Do things with result.control and result.someStuff 
} 
12

沒有也不會,三元運營商將有可能對的:左邊和右邊的值。

假設你正在使用.NET 3.5及以上版本,你可以儘管這樣做:

foreach(string control in controls.Where(c => !c.Equals(string.Empty))) 
{ 
    foreach(int someStuff in moreStuff.Where(s => !s.Equals(0))) 
    { 
    } 
} 
+0

不錯的功能,即使我仍然覺得這可讀性較差;) – fresskoma 2010-09-01 09:18:05

+0

我使用3.5,但不能看到這個功能..奇怪。 – 2010-09-01 10:55:28

+0

你是否包含System.Linq? Where()是IEnumerable上的擴展方法。 – 2010-09-01 12:24:43

5

約劈裂內碼爲單獨的功能是什麼?

foreach (String control in controls) 
{ 
if (!control.Equals(String.Empty)) 
{ 
    foo(control); 
} 
} 
+2

這總是一個很好的答案;)(+1) – atamanroman 2010-09-01 09:50:34