转换列表<;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方法来进行这种转换?
好吧,一种方法如下:
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();