2015-01-13 4 views
-4

Я пытаюсь использовать тернарный оператор в последней части оператора for для увеличения или уменьшения индекса. Но, похоже, это не является правильным утверждением в c sharp? Я пытаюсь переместить некоторый код из Javascript, поэтому я пытаюсь это сделать.Тернарный оператор в -for-statement

for (int _j = 0, _ref = (int) Math.Floor((double)array.Count/2); 
     0 <= _ref ? _j < _ref : _j > _ref; 
     0 <= _ref ? _j++ : _j--) 
    { 
     _results1.Add(_j); 
    } 

Любая идея о том, как реализовать тернарный оператор в инструкции for в C#?

+3

Просто извлеките логику до метода; не пытайтесь встроить его. – Servy

+8

То, что вложенные тройники заставляют мои глаза кровоточить :( – BradleyDotNET

+0

Читаемый код намного лучше, но .. –

ответ

0

Тернарный оператор ожидает два выражения, поэтому это не сработает. Что вы можете сделать, так это:

_j += (0 <= _ref ? 1 : -1); 

Это выглядит хуже, чем ужасно.

+2

Он представил два выражения. Его код является допустимым условным выражением. '_j ++' - это выражение. – Servy

+1

@Servy В C# это даже не компилируется. 'for (var i = 0; i <10; someBool? i ++: i--) {}' Или я что-то упускаю? –

+1

Вы правы, что он не будет компилироваться, вы ошибаетесь в причине * причины *, он не будет компилироваться. Это ошибки по совершенно другой причине, о которой вы говорили. Синтаксис, предоставляемый для условного оператора, совершенно прекрасен; код не компилируется, потому что допустимый условный оператор недопустим в контексте, в котором он используется. – Servy

1

в C# а для заявления ожидает инициализации-оператор, логическое значение experssion, приращение-заявление

Вы можете разделить это в двух случаях:

_ref = (int) Math.Floor((double)array.Count/2); // assuming this can go negative... 
if(0 <= _ref) 
{ 
    for (int _j = 0; _j < _ref; _j++) 
    { 
     _results1.Add(_j); 
    } 
} 
else 
{ 
    for (int _j = 0; _j > _ref; _j--) 
    { 
     _results1.Add(_j); 
    } 
} 

, если Вам нравится этот текст короче вы можете удалить все фигурные скобки ...

+0

во втором цикле. Я думаю, вы имеете в виду 'int _j = _ref' –

+0

Нет, его' _j = 0' в обоих случаях. – DrKoch

+0

И тогда вы можете заметить, что условие 'if' всегда верно, если только кто-то не изобрел массивы с отрицательной длиной, когда я не смотрел. –

1

Условное выражение, 0 <= _ref ? _j++ : _j--, не является действительным заявлением. Вы можете сделать заявление из него любым путём, но поскольку оно является неполным. Поскольку сообщение об ошибке, которое вы получаете, указывает, что оператор должен быть await, вызовом метода, приращением/декрементом или новым выражением объекта, чтобы он был действительным выражением выражения. Условный оператор не входит в этот список.

Конечно, вместо того, чтобы добавлять совершенно ненужный метод к этому выражению, реальное исправление заключается в том, чтобы просто не использовать условный оператор, как это в первую очередь, вместо того, чтобы добавлять еще более нечитаемый код, чтобы его можно было скомпилировать.

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