2010-09-01 3 views
3

В настоящее время я борюсь с примерно 5 вложенными if-утверждениями и его запутыванием, чтобы просмотреть все из них.Тернарный оператор в foreach

Так, я думал о добавлении тройных операторов вместо сослагательного наклонения для простых проверок, см

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

Thats, как она выглядит сейчас. То моя идея о том, как сделать его немного более приятно:

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

Будет ли это даже скомпилировать? Насколько мне известно, как левое, так и правое значение ':' должно быть значением. (Тернарный оператор возвращает значение). –

+0

Это не похоже, что тройной оператор помогает вам в читабельности и функциональности. Если вам нужно 5 lvls deep 'foreach', тогда я думаю, вам может понадобиться переосмыслить вашу функциональность. – Stefanvds

+0

Почему бы вам не написать« if! ... continue »? Это на самом деле даже короче, чем ваш пример, это понятно, а лучшее - работает. – greenoldman

ответ

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 значительно облегчит вам жизнь, хотя вам нужно будет дать более полный пример того, что вы хотите сделать, чтобы было ясно.

EDIT: Просто чтобы дать альтернативу ответ Дэйва:

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

+0

Я использую 3.5, но не вижу эту функцию .. странно. –

+0

Вы включаете System.Linq? Где() - метод расширения в IEnumerable. –

5

насчет spliting внутренний код на отдельные функции?

foreach (String control in controls) 
{ 
if (!control.Equals(String.Empty)) 
{ 
    foo(control); 
} 
} 
+2

это всегда хороший ответ;) (+1) – atamanroman

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