【问题标题】:How do I refer to properties of object array inside jagged array in c#?如何在c#中引用交错数组中对象数组的属性?
【发布时间】:2013-02-28 17:43:09
【问题描述】:

这个问题可能会有点令人困惑,因为我刚刚开始 c# 和一般的面向对象编码,但我会尽力解释清楚!就上下文而言,我正在尝试为游戏项目制作一个随机地牢生成器。

我有一个锯齿状数组“Dungeon”,我这样声明:

public Level[][,] Dungeon;

为了澄清,地牢是一个“关卡”的一维数组。关卡是它自己的对象,它有一些我在其构造函数中定义的独特属性。

每个级别都是“mazePieces”的二维数组,它们也是对象。

我已经弄清楚如何引用整个 Dungeon 数组来做一些事情,例如查看地牢中有多少关卡:

Dungeon[x].Length

我也可以参考给定级别中的单个迷宫碎片:

Dungeon[i][x,y].mobAmount

但是,我不知道如何引用整个关卡的属性。如果我输入

Dungeon[i].numberOfRooms

“numberOfRooms”未被识别为关卡的属性。但是,我发现如果我输入它就会被识别

Dungeon[i][,].numberOfRooms

我遇到的问题是第二组括号标有语法错误,表示需要一个值。

我可以在第二组括号中添加什么,以便我可以参考整个关卡,而不仅仅是关卡的特定部分?

希望这至少可以理解,请告诉我,我会尽力澄清!谢谢!

【问题讨论】:

  • 您必须遍历所有元素才能获得整个属性集合。
  • 感谢大家的回答!我让一个朋友看了一下,我意识到我实际上并不需要一个锯齿状数组——每个关卡对象都包含一个数组,所以 Dungeon 只需要一个一维数组,而不是锯齿状数组。我想我要么在想事情,要么还没有真正理解对象的整个概念。很抱歉造成混乱!

标签: c# arrays object properties jagged-arrays


【解决方案1】:

您可以在设计中使用更多的构图。也许是这样的:

class Dungeon {
    public Level[] Levels { get; private set; }

class Level {
    public int NumberOfRooms
        { get { return Maze.GetUpperBound(0) * Maze.GetUpperBound(1); }
    public MazePiece[,] Maze { get; private set; }
}

class MazePiece {
    private List<Mob> _mobs = new List<Mob>();
    public IEnumerable<Mob> Mobs { get { return _mobs; } }
    public int MobCount { get { return _mobs.Count; } }
}

class Mob {
    public string Name { get; private set; }
}

那你就可以更自然的指代事物了:

var mobsAtTenTenOfLevelThree = dungeon.Levels[2].Maze[9, 9].Mobs;

【讨论】:

    【解决方案2】:

    我会说迷宫应该是Level类的一部分,

    所以你会

    public Levels[] Dungeon.
    

    你的Level 类也有索引器:

    public SomeReturnType this[int x, int y]
    {
       get
       {
          // return maze piece
       }
    }
    

    在这种情况下,您可以通过Dungeon[i].numberOfRooms 访问任何级别的属性。你仍然可以访问你想要的迷宫碎片Dungeon[i][x,y].mobAmount

    【讨论】:

    • 这就是我想要做的,我最终还是弄明白了!我只是有错误的语法——我实际上只需要一个 1D 级别数组,而不是一个锯齿状数组,因为每个级别对象已经包含一个 2D 迷宫数组。谢谢!
    【解决方案3】:

    假设numberOfRoomsMazePiece 的属性,如果你想为地牢找到一个total,你可以使用SelectMany

    int totalRooms = dungeon.SelectMany(p=>p.numberOfRooms).Sum();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      相关资源
      最近更新 更多