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