【问题标题】:Select from two indexing lists, create list of new objects从两个索引列表中选择,创建新对象列表
【发布时间】:2013-10-14 12:26:40
【问题描述】:

我有两个列表:List<Vertex> points,包含顶点 (x,y) 和一个列表 List<Triangles> triangles,包含三角形的节点 (a,b,c)。因此,a,b,c 是定义三角形的点的索引。

我现在想轻松计算这些。例如。我想为每个三角形获取从点 a 到点 b 的所有向量:

list<vector> p21;
foreach triangle t p21.add(new vector(p[t.b].x-p[t.a].x, p[t.b].y-p[t.a].y));

但我确信使用 linq 可以非常优雅地完成此操作。

类似的东西(不使用矢量,而是使用“顶点”)

List<Vertex> = (from triangle in triangles select a,b  and from point in points select new { pi[b].x-pi[a], pi[b].x-pi[a] };

我该怎么做?

【问题讨论】:

  • 我假设您希望三角形是唯一的?
  • 三角形应该是唯一的......我提前检查了这个(delaunay三角剖分)。类似于 List bc = (from triangle in triangles select new Vertex( points[triangle.b].x - points[triangle.c].x, points[triangle.b].x - points[triangle.c ].y)).ToList() 有效还是有更好/更快的选择?

标签: c# linq list select


【解决方案1】:

这似乎做到了。它非常自我描述,并且尽可能简单。

var verticesAb = triangles
    .Select(t => new Vertex(
        points[b].x - points[a].x,
        points[b].y - points[a].y));

如果您需要一个具体的集合,您可以/应该添加.ToList()ToArray()。 您的评论版本似乎也不错。

【讨论】:

  • 完美 - 谢谢。不确定这是否会足够快。
  • @Shrizzi 这是一个 1:1 转换问题 - 没有比 O(n) 更快的方法。
  • 我的意思是在编码方面。我对 linq 和 c# 比较陌生,所以我想知道 for 循环或类似的循环是否会更好。谢谢!
  • @Shrizzi 啊,这边。是的,一旦你习惯了 LINQ,你会很快解决这些任务;)
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2011-10-29
  • 2020-02-16
  • 2011-07-22
相关资源
最近更新 更多