我对C#还是很陌生,但是通过论坛帖子注意到在特定情况下使用a HashSet而不是a 的优点List.
我目前的情况并不是说我在一个单独的存储中存储了大量的数据List,而是我不得不经常检查它的成员.
问题在于我确实需要迭代它,但它们存储或检索的顺序实际上并不重要.
我已经读过,因为每个循环实际上比下一个循环慢,所以我怎么能用尽可能快的方法来解决这个问题呢?
.Contains()我正在做的检查数量肯定会损害我的列表性能,因此至少与a的性能相比HashSet会很方便.
编辑:我目前正在使用列表,在多个位置迭代它们,并且在每个位置执行不同的代码.大多数情况下,当前列表包含点坐标,然后我将其用于引用二维数组,然后根据列表的条件执行某些操作或其他操作.
如果我的问题没有直接的答案,那很好,但我认为可能还有其他方法可以迭代HashSet而不仅仅是foreach循环.我目前处于黑暗状态,甚至可能有其他方法,它们提供了哪些优势等等.假设还有其他方法,我还假设有一种典型的首选方法,只有在它不能满足需求(我的需求非常基本).
至于过早优化,我已经知道使用列表,因为我是一个瓶颈.如何解决这个问题是我陷入困境的地方.甚至没有完全卡住,但我不想通过重复测试重新发明轮子只是为了发现我已经尽力而为(这是一个投资超过3个月的大型项目,列表无处不在,但肯定有一些我不想重复,有大量数据,不需要以任何特定顺序存储,等等.
可能是一个愚蠢的问题,但有没有理由使用Math.Sign?
使用Math.Sign而不仅仅使用if语句是否存在速度/优化问题?也许只是最佳实践/代码可读性偏好?
if (rayDirX < 0)
stepX = -1;
else
stepX = 1;
//----------
stepX = (rayDirX < 0) ? (-1) : (1);
//----------
stepX = Math.Sign(rayDirX);
Run Code Online (Sandbox Code Playgroud) 在C#中:
List<List<Point>> SectionList = new List<List<Point>>();
Run Code Online (Sandbox Code Playgroud)
SectionList包含每个子列表在其包含的点数不同的点的列表.
我想弄清楚的是如何按子列表的计数按降序对SectionList进行排序.
因此,如果SectionList有3个点列表,则在排序后,SectionList [0]将包含所有3个列表的最高Count值.
谢谢,神话
我正在为基于网格的自上而下游戏进行A*寻路.我遇到的问题可能最容易理解,如下图所示.星号是玩家/ NPC.黄色星号是当前想要通往X的NPC.红色星号是NPC,在这种情况下是障碍物.黄色细胞是墙壁,白色细胞是地板.虽然目标的整个路径确实无法到达,但我仍然希望获得到下一个最佳位置的路径(在这种情况下,编号为8的点).
我可以轻松地绕过障碍物,但不知道如何按照我的描述完成.如果我一旦遇到障碍就停止它,它在3点停止时无法正常运行.如果我重新开始到距离最终目标最低距离的关闭列表中的图块,如果最终目标在另一个目标上以墙的一面为例,它也可以把事情弄得很糟糕.
有什么建议?我觉得我错过了其他明显的东西,所以请在这里原谅一个白痴.

蒂姆,谢谢
我必须感到厌倦,因为这是在逃避我,感觉它应该非常简单,所以请放轻松我.
如果A,B和C都是内存中的类,则数组是元素0-2:
[0] = A
[1] = B
[2] = C
Run Code Online (Sandbox Code Playgroud)
我想移动数组,使其变为:
[0] = C
[1] = A
[2] = B
Run Code Online (Sandbox Code Playgroud)
我希望能够向任何一个方向前进,但我想如果有人能指出我如何在一个方向上做到这一点我可以找到另一个方向.
编辑:我想应该提一下,如果可能的话,我需要这个没有迭代.
编辑2:这是伪无限地形的3D游戏.数组中的每个对象都是地形数据块.我想要移动它们,因为它们包含非常大的锯齿状阵列,每个阵列都有大量数据.当玩家移动时,我会有地形滑动(进入/退出)内存.我从未考虑过仅使用array.copy移动数组然后完全重建下一系列块的性能.
因此,为了消除这个相对较小的性能问题,我想按照所描述的方式使用包装来移动数组,而不是通过重新分配内存来重建整个下一系列的块,我将重新使用复制时提到的巨大的锯齿状数组将默认值放入其中而不是完全重新初始化它们.
为了踢,所以你可以看到我以前在做什么:
public void ShiftChunks(strVector2 ChunkOffset) {
while (ChunkOffset.X < 0) {
Array.Copy(Chunks, 0, Chunks, 1, Chunks.Length - 1);
for (int X = 1; X < maxChunkArraySize; X++)
for (int Z = 0; Z < maxChunkArraySize; Z++)
Chunks[X][Z].SetArrayPosition(X, Z);
Chunks[0] = new clsChunk[maxChunkArraySize];
for (int Z = 0; Z < maxChunkArraySize; Z++)
Chunks[0][Z] = new clsChunk(0, …Run Code Online (Sandbox Code Playgroud) 就像是:
forelement (element G_Element, Grid)
{
Grid[G_Element.dim1, G_Element.dim2] =
new clsGridElement(G_Element.dim1, G_Element.dim2);
}
Run Code Online (Sandbox Code Playgroud)
代替
for (int X = 0; X < GridWidth; X++)
for (int Y = 0; Y < GridHeight; Y++)
Grid[X, Y] = new clsGridElement(X, Y);
Run Code Online (Sandbox Code Playgroud)
如果某些东西不是天生存在的,那么可以创造出什么?
蒂姆,谢谢
c# ×5
iteration ×2
.net ×1
a-star ×1
hashset ×1
if-statement ×1
list ×1
math ×1
path-finding ×1
performance ×1
sign ×1
sorting ×1