三元运算符实现循环

时间:2014-11-10 19:20:09

标签: c# loops ternary

我正在尝试将两个循环合并为一个。这个循环应该从头到尾遍历数组,否则。但是我的增量不正确。有人可以帮忙吗? T 提前取决于你。

for (int i = ((asc == true) ? 0 : calendar.Length - 1);
    ((asc == true) ? i < calendar.Length : i > 0); 
    (asc==true) ? i++ : i--)

4 个答案:

答案 0 :(得分:6)

就个人而言,我发现非常难以阅读,以及无效(它不会编译) - 因为你试图使用条件运算符作为语句表达式,当它不是。就个人而言,我写的是:

for (int i = 0; i < calendar.Length; i++)
{
    int index = asc ? i : calendar.Length - 1 - i;
    // Now use index...
}

使三个不同的方面所有条件感觉都是一种讨厌的方式。

答案 1 :(得分:4)

Jon提出了一个很好的选择,但是如果原则:

for (int i = (asc ? 0 : calendar.Length - 1);
     asc ? i < calendar.Length : i >= 0; 
     i += asc?1:-1)
{
            //body
}

答案 2 :(得分:4)

查看&#34;对于&#34;:http://msdn.microsoft.com/en-us/library/ch45axte.aspx

的C#参考

具体做法是:

迭代器部分定义了循环体的每次迭代后发生的事情。迭代器部分包含以下几个或多个语句表达式,以逗号分隔:

  • 任务说明
  • 调用方法
  • 前缀或后缀增量表达式,例如++ i或i ++
  • 前缀或后缀递减表达式,例如--i或i -
  • 使用新
  • 创建对象
  • 等待表达

表达式:&#34;(asc == true)? i ++:我 - &#34;这些都不是。

因此,您需要分配:i + =(asc?1:-1)

for (int i = ((asc) ? 0 : calendar.Length - 1);
      ((asc) ? i < calendar.Length : i >= 0); 
      i += (asc) ? 1 : -1)

顺便提一下,正如评论中指出的那样,你可能希望在条件中查看索引0,所以你的条件语句在&#34;降序&#34; case应该是i> = 0(反映在代码中)。

答案 3 :(得分:1)

for循环是......奇怪的。这也很难读。根据&#34;更好的方法来做到这一点&#34;,我建议只使用Reverse

IEnumerable<Day> collection = asc ? calendar : calendar.Reverse();

for (int i = 0; i < calendar.Length; i++)
{
    collection.ElemantAt(i);// This is the current element
}

//Or better, you are getting everything anyways:
foreach (Day day in collection)
{
}