2010-09-01 180 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