2014-11-10 2 views
2

Я пытаюсь сделать двумя петлями в один. Этот цикл должен проходить через массив от начала до конца и в противном случае. Однако мой прирост неверен. Может ли кто-нибудь помочь? T приветствуем вас заранее.Тернарный оператор в действии цикла

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

Хороший лорд, который трудно читать – Jonesopolis

+11

* Почему * вы пытаетесь сделать две петли в одну? И почему вы сравниваете с «истинным», а не просто используете 'asc' в качестве условия? В основном вы пытаетесь злоупотреблять условным оператором ... –

+6

Я был бы очень расстроен, если бы увидел этот код в производстве. Просто используйте «Обратный» ради добра. – BradleyDotNET

ответ

3

Посмотрите на C# ссылка на " за ": http://msdn.microsoft.com/en-us/library/ch45axte.aspx

в частности:

в разделе итератора определяет, что происходит после каждой итерации тела цикла. Раздел итератора содержит ноль или более из следующих выражений заявления, разделенных запятые:

  • оператор присваивания
  • вызова из
  • выражения префикса или приращения постфиксного метода, например, ++ я или я ++
  • префикса или постфикса декремент выражения, такие как --i или i--
  • создание объекта с помощью нового
  • ждут выражение:

Выражение: "(asc == true)? я ++: i--»не является ни одна из этих вещей

Таким образом, вы хотите назначение:. I + = (? возрастанию 1: -1)

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

Кстати, как отметил в комментарии , вы, вероятно, захотите посмотреть на индекс 0 в условии, поэтому ваш оператор условия в «нисходящем» случае должен быть i> = 0 (отражен в коде).

+1

Это тоже должно быть 'i> = 0'. – juharr

5

Лично я считаю, что очень трудно читать, а также недействителен (он не будет компилировать) - потому что вы пытаетесь использовать условный оператор в выражении заявление, когда он не , Лично я бы написать что-то вроде:

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

Создание три различных аспекта все условные Ощущается как неприятный путь.

+2

Я думаю, вы хотели вычесть 'i' в конце вместо' index'. – juharr

+0

@juharr: Да, спасибо. –

+0

Я не вижу, где условный op используется как оператор, 'for (a; b; c)' требует 3 выражений. –

1

Это для цикла ... нечетное. Это также очень трудно читать. В духе «лучших способов сделать это», я хотел бы предложить только с помощью 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) 
{ 
} 
4

Джон предложил хороший вариант, но если принцип:

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

Это исправляет фундаментальную проблему с исходным кодом. И раздражает сравнение «bool» с «true». – juharr

+0

Чтобы быть справедливым, вы делаете предположение, что это не сравнение с System.Nullable . – lsuarez

+0

Спасибо большое, вот что мне нужно –

Смежные вопросы