2009-05-11 4 views

Répondre

0

Vous pouvez rouler votre propre en utilisant la yield keyword. Voici quelque chose qui vous donnera des fonctionnalités similaires. Vous devrez inclure cet espace de noms pour utiliser l'interface IEnumerable:

using System.Collections; 

Voici un exemple:

public static void Main() 
{ 
    string[] myColors = { "red", "green", "blue" }; 
    // this would be your external loop, such as the one building up the table in the RoR example 
    for (int index = 0; index < 3; index++) 
    { 
     foreach (string color in Cycle(myColors)) 
     { 
      Console.WriteLine("Current color: {0}", color); 
     } 
    } 
} 

public static IEnumerable Cycle<T>(T[] items) 
{ 
    foreach (T item in items) 
    { 
     yield return item; 
    } 
} 

La méthode Cycle utilise generics dans l'échantillon de code ci-dessus pour permettre l'utilisation d'autres les types. Par exemple, lorsque mycolors est déclarée, vous pouvez utiliser:

int[] myInts = { 0, 1, 2, 3 }; 
bool[] myBools = { true, false }; 

Et dans la boucle que vous pourriez avoir:

foreach (int i in Cycle(myInts)) 
{ 
    Console.WriteLine("Current int: {0}", i); 
} 
foreach (bool b in Cycle(myBools)) 
{ 
    Console.WriteLine("Current bool: {0}", b); 
} 
+0

Superbe. Merci beaucoup, monsieur. – eusden

0

Il n'y a pas de fonction intégrée pour accomplir cela - vous devrez le coder vous-même. Vous pouvez accomplir la même chose en utilisant modulo, mais vous devrez utiliser une boucle for (ou un type d'index):

var colors = new Liste {"Rouge", "Vert", "Bleu"};

for (int i=0; i < rows.length; i++) { 
    out.write("<p class='" + colours[i % colours.Count] + "'>" + rows[i].Name + "</p>"); 
} 

Maintenant, je suis sûr que vous conviendrez que cela est beaucoup plus élégant que stupide choses Ruby ;-)