1

我有一个双 foreach 循环,我想知道是否可以通过巧妙地使用 Linq 来避免它。

所以我有一个几何形状,它由多边形集合定义,其中多边形是顶点的集合。

我想计算顶点的平均值。这是我的代码,效果很好,但我觉得使用 Linq 可能会更漂亮。但是我想不出一种方法来做到这一点。任何人都可以帮忙吗?

HashSet<Vector2> vertices = new HashSet<Vector2>();

// This double foreach is what I want to get using Linq if it is even possible.
foreach (var polygon in polygons.Select(a => a.points))
{
    foreach (var vertex in polygon)
    {
        vertices.Add(vertex);
    }
}

Vector2 c = new Vector2(0, 0);
foreach (var vertex in vertices)
{
    c += vertex;
}

c.X = c.X / vertices.Count;
c.Y = c.Y / vertices.Count;
this.center = c;
4

3 回答 3

4
polygons.SelectMany(p => p.Points).Distinct()
于 2013-11-11T19:50:04.747 回答
1

您应该使用SelectManyLINQ 方法。有了HashSet.UnionWith你甚至不需要Distinct打电话:

var vertices = new HashSet<Vector2>();
verticles.UnionWith(polygons.SelectMany(x => x.points))

您还可以使用 LINQ 替换第二个foreach循环:

var c = verticles.Aggregate(new Vertor2(0,0), (v,x) => v += x);
于 2013-11-11T19:53:37.563 回答
0

您可以使用SelectMany方法。这将产生一个可枚举的,但您也可以执行ToList(),这会产生一个List

var vertices = polygons
    .SelectMany(x => x.points)
    .ToList();
于 2013-11-11T19:50:40.463 回答