我有一个简单的字符串列表。这些值是一系列连续的 XY 对。所以
X、Y、X、Y、X、Y
等等..
我想编写一个 LINQ 语句将它们转换为
IEnumerable<Point>
(特别是 System.Windows.Point
),而不创建中间列表。看来我应该能够通过 Skip
、Take
、甚至 SelectMany
的某种组合来做到这一点,但我的 LINQ-fu 处于中途,我不知道如何做到这一点。
我能想到的最好的方法是函数枚举器。如果必须的话,我可以忍受这一点。但是有LINQ的方式吗? (至少不会慢很多?)
using System.Windows;
...
private static IEnumerable<System.Windows.Point> EnumeratePoints(IReadOnlyList<string> list)
{
var numPoints = list.Count / 2;
if (list.Count % 2 != 0)
throw new ArgumentException("Invalid # of points");
for (var i = 0; i < numPoints; ++i)
{
var idx = i * 2;
yield return new Point(double.Parse(list[idx]), double.Parse(list[idx+1]));
}
}
您可以使用Chunk扩展方法。
var result = list.Chunk(2)
.Select(p = new Point(double.Parse(p[0]), double.Parse(p[1])))
.ToList();