数组如何在C#中工作?

时间:2010-05-21 02:59:19

标签: c# arrays

我知道它们用于存储数据,但我很难理解如何在程序中使用它们。

此外,我发现this网站上有一个俄罗斯方块克隆教程(缺少实际教程)。它使用数组,但我无法理解它是如何工作的。

以下是代码示例 -

public int[, ,] TShape = new int[4, 4, 2] 
            {
            {{1, 0}, {0, 1}, {1, 1}, {2, 1}}, 
            {{1, 0}, {0, 1}, {1, 1}, {1, 2}}, 
            {{0, 0}, {1, 0}, {2, 0}, {1, 1}}, 
            {{0, 0}, {0, 1}, {1, 1}, {0, 2}}};

可能是因为我看起来太难了,或者有些东西我没有理解它?

5 个答案:

答案 0 :(得分:9)

如果以这种方式格式化会更清楚:

public int[, ,] TShape = new int[4, 4, 2]  
     { 
          {  {1, 0}, // <- this is int[2]
             {0, 1},  
             {1, 1},  
             {2, 1}   },  // <- the last four lines are an int[4,2]

          {  {1, 0},  
             {0, 1},  
             {1, 1},  
             {1, 2}   },  // <- another int[4,2]

         {   {0, 0},  
             {1, 0},  
             {2, 0},  
             {1, 1}   },   // <- third int[4,2]

         {   {0, 0},  
             {0, 1},  
             {1, 1},  
             {0, 2}   }   // <- fourth and last int[4,2] 
     };               //   <- The whole thing is int[4, 4, 2] 

答案 1 :(得分:3)

  

“好吧,我一直很难过   了解如何使用数组。一世   知道它们用于存储数据,   但我还没有找到任何资源   这给出了一个更明确的解释   该“。

我会尝试给你一个类比:数组是像文件柜一样编程到办公室。唯一的区别是文件柜仅限于它可以容纳的内容:即文件......数组的唯一限制是它必须保存相同类型的项目,但项目的实际类型可以接近任何。数组不仅可以保存数据,还可以保存对象,其他数组,其他容器等。

那么在编程中你可以用一个数组做什么?好吧很多的东西!我们来看几个例子:

  • 财务:数组可以保存今天的股票价格。
  • 游戏:数组可以容纳在关卡中使用的3D模型。
  • 军事:数组可以容纳定位系统识别的所有目标。
  • 等...

数组的主要目的是包含各种的东西并允许我们迭代它们。例如:

// Financial
int[] stockPrices = new int[4]{ 15, 14, 18, 16 }; // contains four prices
foreach( int price in stockPrices )
{
    MakeTransaction(price);// calls a function that makes a transaction at the price: e.g. buy/sell
}

// Gaming
3DModel[] gameModels = new 3DModel[4]{ new Tank(), new Truck(), new Soldier(), new Building()}; // contains 3D models
foreach( 3DModel model in gameModels )
{
    model.Draw();// calls a function of each 3DModel that draws the model on the screen
}

// Military
Target[] targets = new Target[4]{ new Tank(), new Helicopter(), new APC(), new Truck()}; // contains targets
foreach( Target target in targets )
{
    Attack(target);// calls an attack function which initiates an attack on each target
}

可能性无穷无尽!数组是容器的子集,容器是编程的一个组成部分。这有帮助吗?

答案 2 :(得分:2)

直接离开马的嘴:http://msdn.microsoft.com/en-us/library/system.array.aspx

在您完成此http://www.functionx.com/csharp/Lesson21.htm

等在线教程后,这些详细信息将派上用场

答案 3 :(得分:0)

想象一下,你有10个盒子。现在你想清楚告诉别人你正在谈论哪个盒子。所以你为它们分配数字,从0到9.你现在拥有的是一个盒子数组,定义为:

框[10]

括号中的数字告诉您,其中有多少。默认情况下,它们的编号从0到9(某些语言允许更改此值,但现在暂时跳过它)。所以,如果你在谈论第五个盒子,它的盒子[4](因为我们从0开始索引!)。现在想象一下你打开盒子,看到里面有五个球。这定义了一个数组:

框[10] [5]

二维数组。你怎么告诉你的朋友你想谈哪个球?再次,你给他们编号,这次从0到4.如何指定在第七个方框中说出第三个球?简单:方框[6] [2]。等等。希望有所帮助。

答案 4 :(得分:0)

在你的问题中,你说的是使用阵列的俄罗斯方块游戏。无论您使用何种语言,都可以很好地使用数组。

你必须看到俄罗斯方块游戏码作为阵列。假设这个游戏场在X轴上是20个空间,在Y轴上是100个空格。什么告诉你是否在空格上有一个片段,就是当你有一个整数值1,并且你得到一个空格的整数值0。然后我们得到:

var tetrisPlayYard = new int[20][100];

您现在必须将电路板的每个位置初始化为0,以便将它们标记为空格,因此尚未放置任何碎片。

for(int xAxisIndex = 0; xAxisIndex < tetrisPlayYard.GetLength(0); ++xAxisIndex )
    for (int yAxisIndex = 0; yAxisIndex < tetrisPlayYard.GetLength(1); ++ yAxisIndex)
        tetrisPlayYard[xAxisIndex][yAxisIndex] = 0;

我们现在知道,当每个阵列的位置都设置为0时,没有任何碎片。

然后,当我们放置时,让我们说在板的右下方水平四行直线,然后我们必须处理4个空格,并将它们的值设置为1以指示这些空间上有一块

tetrisPlayYard[19][99] = 1;
tetrisPlayYard[18][99] = 1;
tetrisPlayYard[17][99] = 1;
tetrisPlayYard[16][99] = 1;

这表示你有一个四个直线的空格。你的算法应该解决这个逻辑,以便在玩游戏时显示条形图,立方体等。

总之,只要知道有限空间就使用数组,并且您知道不需要动态调整它的大小。否则,应使用Collection