2010-09-01 7 views
3

Je suis actuellement aux prises avec environ 5 if-statements imbriqués et il devient assez déroutant de les regarder tous.Opérateur ternaire dans foreach

Alors, je pensais à ajouter des opérateurs ternaires au lieu de ifs pour des contrôles simples, voir

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

est comment il ressemble en ce moment. Thats my idée sur la façon de le faire paraître un peu plus agréable:

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

Ainsi, les questions sont: 1. est une mauvaise programmation pour le résoudre comme ça et 2. ça va fonctionner comme je le veux?

+2

Est-ce que cela compilera même? Autant que je sache, les deux côtés gauche et droit de ': 'doivent être une valeur. (L'opérateur ternaire renvoie une valeur). –

+0

il ne ressemble pas à l'opérateur ternaire vous aide à la lisibilité et la fonctionnalité. Si vous avez besoin de 5 lvls profond 'foreach' alors je pense que vous devrez peut-être repenser votre fonctionnalité – Stefanvds

+0

Pourquoi n'écrivez-vous pas" if! ... continue; "? C'est en fait encore plus court que votre exemple, c'est clair, et le meilleur - ça marche. – greenoldman

Répondre

3

Pourquoi ne faites-vous pas ce qui suit?

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, sa manière plus lisible :)

2

Non, qui ne fonctionnera pas du tout. L'opérateur conditionnel ne vous permet pas de changer le contrôle de flux comme ça - il évalue simplement la deuxième ou la troisième expression basée sur la première. Le résultat de l'expression conditionnelle est le résultat de l'expression évaluée (après l'application des conversions requises). Il est probable que LINQ vous facilitera la vie ici, bien qu'il faille donner un exemple plus complet de ce que vous voulez faire pour que ce soit clair.

EDIT: Juste pour vous donner une alternative à la réponse de Dave:

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

Non, ce ne sera pas, l'opérateur ternaire doit avoir des valeurs à gauche et à droite de :.

présumant que vous utilisez .NET 3.5 et au-dessus, vous pouvez le faire si:

foreach(string control in controls.Where(c => !c.Equals(string.Empty))) 
{ 
    foreach(int someStuff in moreStuff.Where(s => !s.Equals(0))) 
    { 
    } 
} 
+0

Nice fonctionnalité, même si je trouve encore moins lisible;) – fresskoma

+0

J'utilise 3.5, mais ne peut pas voir cette fonctionnalité .. étrange. –

+0

Êtes-vous en train d'inclure System.Linq? Where() est une méthode d'extension sur IEnumerable. –

5

Qu'en est-spliting le code interne dans des fonctions distinctes?

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

c'est toujours une bonne réponse;) (+1) – atamanroman