Linq: convert IEnumerable <Point> to IEnumerable <float>

I have , and I want to convert it to . IEnumerable<Point> IEnumerable<float>

Can I do this in a single Linq expression?

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;
}
+3
source share
2 answers

Yes, you can use SelectMany :

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

Another way that LINQ does not require is to use an iterator block:

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

FWIW, you can also do inverse - convert the list of floats into a list of PointF structures (turning off Mark's answer):

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();
+1
source

Source: https://habr.com/ru/post/1772167/


All Articles