Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使类存储在2d数组中;“意识到”;他们在其中的地位如何?_C#_Arrays_Vb.net_Matrix - Fatal编程技术网

C# 如何使类存储在2d数组中;“意识到”;他们在其中的地位如何?

C# 如何使类存储在2d数组中;“意识到”;他们在其中的地位如何?,c#,arrays,vb.net,matrix,C#,Arrays,Vb.net,Matrix,我想标题说明了一切。。。但为了完整性起见,这里是全部问题 问题 因此,我在VisualBasic/C#/Anything.net中有一个2列数组(矩阵或“网格”),它由Cell实例组成,声明为公共矩阵(,)为Cell 单元格大致如下: Class Cell Public Value as integer Public Height as integer Public Tags as Dictionary Sub New(Optional v As CellTy

我想标题说明了一切。。。但为了完整性起见,这里是全部问题

问题 因此,我在VisualBasic/C#/Anything.net中有一个2列数组(矩阵或“网格”),它由
Cell
实例组成,声明为
公共矩阵(,)为Cell

单元格
大致如下:

Class Cell

    Public Value as integer
    Public Height as integer
    Public Tags as Dictionary

    Sub New(Optional v As CellType = CellType.Void)
        value = v
        type = v
    End Sub

    Function GetPos() as Point
        *need arcane necromancy here*
    End Sub

End Class
问题很简单,但我知道答案可能不是:我可以在不将其传递给构造函数的情况下获得
单元格的位置吗

下面是我想要实现的一个示例(始终以单元格形式给出
公共矩阵(,):

关于这个问题的必要性的附带问题 目前,我正在使用以下代码片段将所有单元格初始化为零值,因为使用
Matrix.initialize()
失败了,每个元素都设置为零

如果方法描述说它调用默认构造函数,那么为什么它失败了

虽然从编码/效率的角度来看,我怀疑我的初始化是正确的,因为我认为双循环并没有那么好

 For x = 0 To Me.zWidth
     For y = 0 To Me.zHeight
         Matrix.SetValue(New Cell(CellTypes.Void), x, y)
     Next
 Next
我现在坚持下去。因此,这里有一个

可能的解决办法 这意味着我可以在初始化时通过构造函数将索引传递给位置字段,如下所示

 For x = 0 To Me.zWidth
     For y = 0 To Me.zHeight
         Matrix.SetValue(New Cell(CellTypes.Void,x,y), x, y)
     Next
 Next
但是,由于
单元格
可能会改变位置或被覆盖,因此我希望动态确定其位置。

但是,如果雷达中没有更好的东西,我肯定会使用这种方法,然后根据位置变化更新值

补遗 一些可能有用或不有用的信息:

  • 矩阵大小小于或等于(512512)
  • 这将成为一个等轴测(所以没有3d,但我已经有了一个高度可变的单元格)游戏的地形数据地图生成器,具有相当小的地图,支持山、河等表面特征

为什么你不能减少随机选取器,只返回找到的x,y值,然后用它来检索你的单元格?大概是这样的:

Dim pt as Point
pt = GetRandomPosition()
Dim apple as Cell = Matrix(pt.X,pt.Y)
Console.WriteLine(String.Format("An Apple is in {0}, {1}",pt.X,pt.Y)

这确实是一个建模的问题。我个人更希望细胞知道自己的位置,因为这对他们来说似乎很重要,但对于一个人来说,你似乎不喜欢这种方法,而对于两个人来说,当更新位置时,必须同时在两个领域(受影响的细胞和网格中)进行(通过辅助方法),这可能会有问题。因此,还有一件事:

从一个简单的2D数组逐步过渡到构建您自己的类型,就像一个更智能的数组,它不仅将单元格网格保持为一个简单的2D数组,但也记录每个
单元
及其坐标——一个字典,将每个包含的
单元
映射到一对表示
x
y
的整数。让我们称之为智能阵列
SmartArray
。它需要移动单元格的方法,以原子方式更新地图和网格(这是可以的,因为所有更改都在
SmartArray
的“领域”中)。然后,您可以询问
SmartArray
实例“网格上的Cell
c
?”并在
O(1)
中给出答案。这将是速度与内存占用的折衷。但是,每个
单元
必须知道它们包含的
智能阵列
,以便它知道该询问谁


您也可以省去映射,保留查询方法,但每次提出问题时都要让它们遍历网格。答案是一样的,查找需要
O(n^2)
,但是移动单元格会更容易,因为您只需要更新一个结构。这将使折衷转向一个更倾向于内存占用而不是速度的折衷,本质上是您在q中提到的双循环。

首先初始化N个元素,您必须调用初始化器N次,没有效率问题

回答你的问题:你的物品不应该在意它的位置。项目在集合中的位置不是项目本身的问题,如果移动项目或更改集合,可能会很快导致头痛。 如果您的集合从二维矩阵更改为三维矩阵,该怎么办?您必须重写代码并添加Z变量(这只是一个简单的示例)

我会尝试以另一种方式完全构建我的代码/解决方案

顺便说一下,项目可以通过查找对自身的引用在集合中定位自身。(根据需要根据矩阵调整代码)


性能很差,因为您循环收集,但它可能适合您的需要

我希望让
单元格
自己提供它,因为这是为了模拟,在模拟中,我还将查询
单元格
的位置,而之前不知道它。随机挑选是为了测试位置检索系统:p您只有两个选择:(1)将位置传递给单元构造函数(正如您已经提到并拒绝的那样)或(2)通过在容器中搜索单元(一个O(N)操作)按需计算位置。我的问题是,为什么
GetPos
Cell
的一种方法?你有什么好的理由吗,还是仅仅因为它是你自然而然地想到的?因为根据我的经验,这些问题实际上相当棘手,要想让它们“正确”,有时需要做出违反直觉的选择。在这种情况下,我认为细胞根本不应该知道自己的位置。你一开始是如何获得对单元格的引用的?不管你怎么做,这可能不是一个好主意——与其存储对单元格的直接引用,不如遍历矩阵。我正在为一个游戏制作一个地形数据地图生成器的原型,该游戏具有相当小的地图,支持山、河、,我不知道我们可以对多索引数组中的每个
执行
。。。酷!你说的“另一种方式”是什么意思?如果你
Dim pt as Point
pt = GetRandomPosition()
Dim apple as Cell = Matrix(pt.X,pt.Y)
Console.WriteLine(String.Format("An Apple is in {0}, {1}",pt.X,pt.Y)
GetPosition( Array source)
{
    foreach(var element in source)
       Object.ReferenceEquals(this,element)
}