转换列表<;int>;到列表<;要点>;使用LINQ

本文关键字:gt lt 列表 使用 LINQ 要点 int 转换 | 更新日期: 2023-09-27 18:21:04

给定均匀大小的List<int>List<Point>

List<int> coords = new List<int> (){23, 137, 76, 151, 61, 203};
List<Point> points = new List<Point>();

我知道我可以用老式的方法:

for (int i = 0; i < coords.Count; i += 2) points.Add(new Point(coords[i], coords[i+1]));

但我想知道是否有一种很好的LINQ方法来进行这种转换?

转换列表<;int>;到列表<;要点>;使用LINQ

好吧,一种方法如下:

List<int> coords = new List<int> (){23, 137, 76, 151, 61, 203};
List<Point> points = Enumerable.Range(0, coords.Count / 2)
    .Select(i => new Point(coords[i * 2], coords[(i * 2) + 1]))
    .ToList();

可能还有十几种其他方法,但是,我认为在这种情况下,简单的for循环实际上是最简洁明了的解决方案。

这不是LINQ,但您可以创建自己的扩展方法:

public static IEnumerable<Point> ToPoints(this List<int> source)
{
    for (int i = 0; i < source.Count; i += 2)
    {
        yield return new Point(source[i], source[i + 1]);
    }
}

用法:

List<Point> points = coords.ToPoints().ToList();

这对你来说够吗?

这有帮助吗?

var points = coords.Select((v,i) => new {v,i})
    .GroupBy(x => x.i/2)
    .Select(x => new Point(x.First().v, x.Last().v))
    .ToList();

更新:实际上这应该用Zip命令来解决:

var points = coords.Skip(1).Zip(coords, 
                               (second, first) => new Point(first, second) ).ToArray();

您可以使用Batch方法,来自MoreLINQ库:

List<int> coords = new List<int> (){23, 137, 76, 151, 61, 203};
var points = coords
          .Batch(2)
          .Select(x => new Point(x.First(), x.Last())
          .ToList();