我得IDictionary<Key,Mesh>分,Mesh等于IEnumerable<Vertex>分. Vertex是一个 struct ,包含表示世界位置的VectorInt3.

我想编写一个函数/查询,根据世界位置对所有网格的所有顶点索引进行分组.也就是说,我想要所有的顶点索引,按共享相同世界位置的网格分组

我try 了以下方法:

var vertexMeshGroups = meshes.Values.GroupBy(mesh => mesh.Vertices.Select((RoomVertex vertex,int idx) => (vertex,idx))
                                                                  .GroupBy(ele => ele.vertex.WorldPosition));

but that results in a IGrouping<IEnumerable<IGrouping<VectorInt3,(Vertex, int)>>,Mesh>,
when I would want something more like a IGrouping<VectorInt3,IGrouping<Mesh,int>>

我该如何做到这一点呢? struct 和类如下所示:

public class Mesh
{
    public List<Vertex> Vertices = new List<Vertex>();

    public Mesh()
    {
    }
}

public struct Vertex
{
    public VectorInt3 WorldPosition;
}

推荐答案

How about this kind of code:

var vertexMeshGroups = meshes.Values
    .SelectMany(mesh => mesh.Vertices.Select(vertex => (vertex, mesh))
    .GroupBy(pair => pair.vertex.WorldPosition, pair.mesh);

这是在网上写的,所以它可能包含一些错误,但让我解释一下它的 idea :

网格包含多个顶点.由于该原因,一个网格可以有多个位置,这意味着如果按世界位置分组,一个网格可以位于多个组中.因此,在第一步中,您必须 for each 也知道其父网格元素的世界位置创建一个元组或对.当该对可用时,可以按所需的子属性WorldPosition对这些对进行分组,并将父元素Mesh作为分组的Value元素.

Csharp相关问答推荐

为什么.Equals(SS,StringComparison. ClientCultureIgnoreCase)在Net 4.8和6.0之间不同?

Elasticsearch:当我try 使用c#将嵌套对象添加到filter中时出现问题

==和Tuple对象的相等<>

(乌龙)1&#比c#中的UL&#慢吗?

Quartz调度程序不调用作业(job)类

JSON空引用异常仅在调试器中忽略try-Catch块,但在其他上下文中捕获得很好

TCPClient阅读流

如何捕获对ASP.NET核心应用程序的所有请求并将其发送到一个页面

未在数据流块之间传播完成

如何向事件添加成员

有没有更好的方法来在CosmosDB上插入非id?

如何使用Npgsql从SELECT获得所有查询结果

C#Microsoft.CodeAnalysis.CSharp.Scriiting不等待并行.对于

毛伊岛.NET 8图片不再适合按钮

为什么当我try 为玩家角色设置动画时,没有从文件夹中拉出正确的图像?

正在try 将自定义字体添加到我的控制台应用程序

当要删除的子模型没有父模型的1:多属性时,如何告诉实体框架设置1:1 FK条目?

为什么我的UserControl没有加载到我的主窗口中?

如何对构建在Clean架构和CQRS之上的控制器进行单元测试?

这是T自身的布尔表达式是什么意思?