代码之家  ›  专栏  ›  技术社区  ›  F.P

foreach中的三元运算符

c#
  •  3
  • F.P  · 技术社区  · 14 年前

    我目前正在努力处理大约5个嵌套的if语句,并且查看所有语句会变得非常混乱。

    所以,为了简单的检查,我考虑添加三元运算符而不是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。是一个很糟糕的程序来解决它。它会按我想要的方式工作吗?

    4 回复  |  直到 14 年前
        1
  •  3
  •   fresskoma    14 年前

    你为什么不做下面的事?

    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
     }
    }
    

    imho,它的方式更易读:)

        2
  •  12
  •   Dave D    14 年前

    不可能,三元运算符必须在 : .

    假设您使用的是.NET 3.5及更高版本,您可以这样做:

    foreach( string control in controls.Where(c => !c.Equals(string.Empty)) )
    {
        foreach( int someStuff in moreStuff.Where(s => !s.Equals(0)) )
        {
        }
    }
    
        3
  •  5
  •   merxbj    14 年前

    如何将内部代码拆分为单独的函数?

    foreach (String control in controls)
    {
     if (!control.Equals(String.Empty))
     {
       foo(control);
     }
    }
    
        4
  •  2
  •   Jon Skeet    14 年前

    不,那根本不行。条件运算符不允许您这样更改流控制-它只根据第一个表达式计算第二个或第三个表达式。条件表达式的结果是对任何表达式进行计算的结果(在应用了任何必需的转换之后)。

    很可能Linq会让你在这里的生活更轻松,尽管你需要给出一个更完整的例子来说明你想做什么。

    编辑:只是为了给戴夫的答案提供一个备选方案:

    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
    }