2010-10-29 5 views
3

J'ai un IEnumerable<Point> et je veux le convertir en un IEnumerable<float>. Puis-je le faire dans une seule instruction Linq?Linq: Convertir IEnumerable <Point> à un IEnumerable <float>

IEnumerable<float> ConvertToPoints(IEnumerable<Point> points) 
{ 
    List<float> floats = new List<float>(); 
    foreach(var point in points) 
    { 
     floats.Add(point.X); 
     floats.Add(point.Y); 
    } 
    return floats; 
} 
+1

Juste après avoir ajouté la question, je suis arrivé avec IEnumerable floats = points.SelectMany (p => new float [] {p.X, p.Y}); – Osiris

+0

Pour insérer du code, il suffit de le mettre en retrait de quatre espaces. Pas besoin de faire tout le balisage HTML vous-même. –

+0

@Brian Rasmussen Merci pour le conseil – Osiris

Répondre

10

Oui, vous pouvez utiliser SelectMany:

return points.SelectMany(point => new float[] { point.X, point.Y }); 

Une autre façon qui ne nécessite pas LINQ est d'utiliser un bloc itérateur:

IEnumerable<float> getPoints(IEnumerable<Point> points) 
{ 
    foreach (Point point in points) 
    { 
     yield return point.X; 
     yield return point.Y; 
    } 
} 
+0

Ma réponse immédiate aurait été le SelectMany, mais que le code de bloc de l'itérateur semble assez doux! – RichK

1

FWIW, vous pouvez aussi faire la inverse - convertir une liste de flottants en une liste de structures PointF (coïncider avec la réponse de Mark):

IEnumerable<PointF> AsPointF(this IEnumerable<float> ordinates) 
{ 
    float x; 
    float y; 

    int i = 0; 

    foreach (float f in ordinates) 
    { 
     switch (i) 
     { 
     case 0: 
      x = f; 
      i++; 
     break; 
     case 1: 
      y = f; 
      i = 0; 
      yield return new PointF(x, y); 
     break; 
     } 
    } 
} 

IEnumerable<float> ordinates = GetOrdinatesFromSomewhere(); 
IEnumerable<PointF> points = ordinates.AsPointF(); 
Questions connexes