2010-10-29 152 views
3

我有一个IEnumerable<Point>,我想将它转换为IEnumerable<float>的Linq:转换IEnumerable的<Point>到IEnumerable <float>

我可以在单个Linq声明中执行此操作吗?

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

刚刚添加问题后,我想出了IEnumerable floats = points.SelectMany(p => new float [] {p.X,p.Y}); – Osiris 2010-10-29 17:35:56

+0

要插入代码,只需将它缩进四个空格。不需要自己完成所有的HTML标记。 – 2010-10-29 17:37:33

+0

@Brian Rasmussen感谢提示 – Osiris 2010-10-29 17:38:22

回答

10

是的,你可以使用SelectMany

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

不需要LINQ是使用迭代器块的另一种方式:

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

我的直接回应是SelectMany,但是这个迭代器代码看起来非常的甜美! – RichK 2010-10-29 18:38:45

1

FWIW,你也可以做反向 - 将浮点列表转换为PointF结构列表(搭载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(); 
相关问题