2010-07-30 7 views
2

Y a-t-il un compact, intégré façon de générer une gamme de flotteurs de min à max avec un donné step?Syntaxe LINQ compacte pour les plages flottantes?

E.g .: plage (10, 20, 0.1) [mais intégrée].

+0

Comment envisagez-vous cela, ou comment cela se rapporte-t-il à LINQ? – Nix

Répondre

5

Vous pouvez faire

Enumerable.Range(100, 100).Select(i => i/10F) 

Mais ce n'est pas très descriptif.

+0

Nice en fait. Bref, ça marche et c'est intégré. – Mau

3

Non, il n'y a rien de intégré. Il serait très facile d'écrire votre méthode statique. Quelque chose comme:

public static IEnumerable<float> FloatRange(float min, float max, float step) 
{ 
    for (float value = min; value <= max; value += step) 
    { 
     yield return value; 
    } 
} 

EDIT: Une alternative en utilisant la multiplication, comme suggéré dans les commentaires:

public static IEnumerable<float> FloatRange(float min, float max, float step) 
{ 
    for (int i = 0; i < int.MaxValue; i++) 
    { 
     float value = min + step * i; 
     if (value > max) 
     { 
      break; 
     } 
     yield return value; 
    } 
} 

En MiscUtil j'ai un code de gamme qui fait des trucs géniaux grâce à des trucs de l'opérateur générique de Marc Gravell, vous permettant :

foreach (float x in 10f.To(20f).Step(0.1f)) 
{ 
    ... 
} 
+0

Merci Jon. Juste curieux d'une version intégrée. :-) – Mau

+0

Ne pas utiliser d'addition, utiliser la multiplication pour une meilleure précision. – liori

+0

Si vous voulez vous assurer que vous allez frapper 'max' dans la gamme, vous aurez besoin d'une comparaison approximative de' max' dans la boucle for au lieu de simplement '<='. Les ajouts répétés pourraient vous faire finir légèrement plus haut que la valeur 'max' donnée. Alternativement, vous pouvez incrémenter jusqu'à ce que vous ayez une longueur inférieure à la valeur max et 'yield return max;' à la fin. –

Questions connexes