C# 在不使用数组的情况下查找特定索引是否有更快的方法?

C# 在不使用数组的情况下查找特定索引是否有更快的方法?,c#,arrays,list,unity3d,optimization,C#,Arrays,List,Unity3d,Optimization,我正在创建一种2D地图,其中coord有一个平铺类连接到它, tile类将在其内部具有坐标,以及稍后将访问的一些其他值,但我希望该映射没有大小限制。问题是,我希望看到该地图中某些平铺中的值,例如:我在coord(25,30),我想知道每个相邻平铺中平铺类中的布尔值 如果我使用一个数组,我可能有最快的方法来检查磁贴的坐标,例如一个包含两个索引的数组。我可以将每个索引分别设为x坐标和y坐标,因此我只会在看到平铺上的值时检查该坐标但地图的大小有限制 如果我使用一个列表,地图的大小将没有限制,但是我

我正在创建一种2D地图,其中coord有一个
平铺
类连接到它,
tile
类将在其内部具有坐标,以及稍后将访问的一些其他值,但我希望该映射没有大小限制。问题是,我希望看到该地图中某些
平铺
中的值,例如:我在coord(25,30),我想知道每个相邻
平铺
平铺
类中的布尔值

  • 如果我使用一个数组,我可能有最快的方法来检查
    磁贴的坐标,例如一个包含两个索引的数组。我可以将每个索引分别设为x坐标和y坐标,因此我只会在看到
    平铺上的值时检查该坐标但地图的大小有限制

  • 如果我使用一个列表,地图的大小将没有限制,但是我不能直接检查坐标,所以我需要用一个foreach循环检查每个创建的
    tile
    ,并检查该tile中的坐标是否与我正在寻找的坐标相同

  • 我当前的解决方案是创建第二个仅包含坐标的列表,并在创建平铺时指定它,因此坐标列表中的索引与平铺列表中的索引相同。因此,当我需要检查磁贴时,我会做一个
    坐标列表。Contains(coordinate)
    ,如果这是真的,那么我会将该坐标的索引作为代码应该在
    磁贴列表中查找的索引

我想要一种更快的方式来检查磁贴,而不受大小限制。

到目前为止,使用
tile
列表,每次检查整个地图时,我得到了大约3200毫秒(列表中大约有2000个
tiles

通过
mapCoord
列表,我得到了大约1500毫秒(大约2000个瓷砖和coords)

有了这个阵列,我得到了非常快的响应(从未测量过),但肯定不到一秒钟。。。因为我从来不用检查整个数组,而是检查某个索引

更容易理解我的问题的示例: 注1:它不会填充所有数组

注2:它并不总是矩形的

到目前为止,最好的方法是检查
mapCoord
列表,如下所示:

if(mapCoord.Contains(desiredCoord))
{
    desiredTile = mapList[mapCoord.IndexOf(DesiredCoord)];
}
[StructLayout(LayoutKind.Explicit)]
struct IntXY
{
    [FieldOffset(0)] Int16 X;
    [FieldOffset(2)] Int16 Y;
    [FieldOffset(0)] UInt32 AsAnUnsignedInteger;

    public override int GetHashCode()
    {
        return AsAnUnsignedInteger.GetHashCode();
    }
}
查找“稀疏数组”作为执行此操作的一种方法。一种可能的实现是字典,其中键实际上是两个int(x和y)的元组。如果游戏以一个标准边界开始(比如起始点的+/-100),你可以混合和匹配一个200x200数组和字典。您还可以通过拥有多个矩形区域(每个区域作为一个阵列)来获得创造性

如果您的总地址空间适合一个短整数(+/-32k),那么您可以这样做:

if(mapCoord.Contains(desiredCoord))
{
    desiredTile = mapList[mapCoord.IndexOf(DesiredCoord)];
}
[StructLayout(LayoutKind.Explicit)]
struct IntXY
{
    [FieldOffset(0)] Int16 X;
    [FieldOffset(2)] Int16 Y;
    [FieldOffset(0)] UInt32 AsAnUnsignedInteger;

    public override int GetHashCode()
    {
        return AsAnUnsignedInteger.GetHashCode();
    }
}

并将其用作字典中的键(使用
LayoutKind.Explicit
使其有效地与C/C++
union
相同-X和Y短路占用与无符号int相同的组合32位)。它可能比元组便宜(尽管您可能想测试我的猜测)。

大小查找“稀疏数组”作为一种方法。一种可能的实现是字典,其中键实际上是两个int(x和y)的元组。如果游戏以一个标准边界开始(比如起始点的+/-100),你可以混合和匹配一个200x200数组和字典。您还可以通过创建多个矩形区域来获得创造性,每个区域都作为一个数组。@spender这是一个类型,它的值应该是x=-size/2,而不是正数,对于y@Flydog57字典真的为我做了,从1500毫秒到近10毫秒,真的是你的好主意,thx很多。。。