使用LINQ </point> </int>将List <int>转换为List <point>

时间:2014-09-07 20:16:01

标签: c# linq

给出偶数大小的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方式来进行这种转换?

4 个答案:

答案 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();