给出偶数大小的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方式来进行这种转换?
答案 0 :(得分:3)
嗯,一种方法是:
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循环实际上是最简洁明了的解决方案。
答案 1 :(得分:2)
这不是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();
LINQ-y对你来说足够了吗?
答案 2 :(得分:2)
这有帮助吗?
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();
答案 3 :(得分:0)
您可以使用MoreLINQ
库中的Batch
方法:
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();