【问题标题】:Convert a List<int> to a List<Point> with LINQ [duplicate]使用 LINQ 将 List<int> 转换为 List<Point> [重复]
【发布时间】:2014-09-07 20:16:00
【问题描述】:

给定一个大小相等的List&lt;int&gt; 和一个List&lt;Point&gt;

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 方法来进行这种转换?

【问题讨论】:

  • 可能有一种方法,但我真的不明白为什么它会比 for 循环有所改进......
  • 使用标准 LINQ 方法没有简单的方法来做到这一点。您的实现非常干净。看看这个question
  • 你觉得这样更干净吗? var list = coords.Where((x, i) =&gt; i % 2 == 0) .Zip(coords.Where((x, i) =&gt; i % 2 == 1), (x, y) =&gt; new Point(x, y)) .ToList();
  • 不是真正的 Linq,但您可以使用 yield 关键字来实现。尝试在 linq 中执行此操作会使代码变得更糟。

标签: c# linq


【解决方案1】:

嗯,一种方法如下:

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 循环确实是最简洁明了的解决方案。

【讨论】:

  • 我想你的意思是使用i*2
【解决方案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 对你来说足够了吗?

【讨论】:

    【解决方案3】:

    这有帮助吗?

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

    【讨论】:

    • 马克的回答会更有效率。
    【解决方案4】:

    您可以使用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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 2016-12-26
      相关资源
      最近更新 更多