【问题标题】:2D-array as a class property - how to create them the C# way?二维数组作为类属性 - 如何以 C# 方式创建它们?
【发布时间】:2017-03-25 19:01:50
【问题描述】:

我正在尝试创建一个具有二维数组属性的类。该数组将保存网格上的各种 x,y 坐标(例如 0,1 或 3,7),并且数组的大小取决于名为 size 的类属性。

您将如何在 C# 中创建这个数组?我在下面给出了我的解决方案,但是我的 C# 经验很少,并且来自 Python 背景和一些 javascript 知识,感觉这个问题有更好的解决方案。

请各位 C# 高手赐教好吗?

提前感谢您的帮助。

这是我的代码:

public class Obj
{
    int Size;  // Defines length of array
    int[,] Pos;

    // constructor
    public Obj(int size)
    {
        this.Size = size;
        this.Pos = new int[size, 2];
    }

    public void set_coord(int index, int x, int y)
    {
        if (index >= this.Size) {
            Console.WriteLine("Catch OutOfRangeException");
        }
        else
        {
            this.Pos[index, 0] = x;
            this.Pos[index, 1] = y;
        }
    }

【问题讨论】:

  • 创建一个也保存坐标而不是使用数组的类。例如,您有一个名为 Coordinate 的类,具有两个属性 X 和 Y。然后您将创建一维坐标数组。
  • 仅供参考:在 C# 中,属性是完全不同的东西。您应该在这里使用的术语是field。此外,看起来您正在创建数组,所以您的问题不清楚。你能详细说明一下吗?
  • 你写的代码没有错;这是创建二维数组的方式,但由于您要存储 x,y 坐标,您只需创建一个 Points 的一维数组(或创建自己的结构来保存 x 和 y 值)您还可能想要了解 C# 属性和索引器
  • 似乎他在寻求最好的解决方案,我很确定没有,你的似乎是有效的,但我更喜欢 M.kazem Akhgary 的方法。
  • 首先,非常感谢您的快速回答。 @KevKong Dennis_E 建议的 Point 类似乎已经存在。编写自己的 Coordinate 类(如 M.kazem Akhgary 所建议的)我有什么优势?

标签: c# arrays class multidimensional-array


【解决方案1】:

您可以创建一个列表而不是一个类,并有一个内部子类来表示您的观点。

像这样

    public class Obj{
      int Size;
      List<Point> Pos = new List<Point>();

      public Obj(int size){
        this.Size = size;
      }

      public set_coord(int index, int x, int y){
        if(index >= this.Size){
          Console.Writeline("Catch OutOfRangeException")
        }else{
          this.Pos.Add(new Point(x,y));
        }
      }
    }

    class Point{
      int x = 0;
      int y = 0;
      public Point(int xCor, int yCor){
        this.x = xCor;
        this.y = yCor;
      }
    }

【讨论】:

  • 感谢您的建议! :) 使用 List 而不是数组有什么好处?我认为列表是没有预定义最大长度的数组?
  • 当您更改其大小时,它们会动态分配内存(正确)。这意味着您作为开发人员无需担心清理内存。假设您需要一个固定数组?感谢 c# 中的 IEnumerable 原型,您只需执行 myList.ToArray()
【解决方案2】:

结构是解决此问题的理想方法。一个完整的课程可能不是必需的,但这取决于。

https://msdn.microsoft.com/en-us/library/ah19swz4.aspx

public struct Coordinates
{  
    public int coordX;  
    public int coordY;  
} 

你的类中的属性可以这样设置:

var Obj = new Obj();
List<Coordinates> listOfCoords = new List<Coordinates>();
var coord = new Coordinates();
coord.X = 20;
coord.Y = 15
listOfCoords.Add(coord); 
Obj.Pos = listOfCoords

请记住,结构不能从其他类或结构以及其他一些陷阱继承或继承。如果您需要这些功能,或者您的结构中的数据在创建后容易被修改(换句话说,数据不是不可变的),请考虑改用一个小类。

https://msdn.microsoft.com/en-us/library/0taef578.aspx

【讨论】:

  • 感谢您的建议。我一直想知道为什么会有结构体,而类会完成结构体正在做的所有事情等等......你知道为什么吗?
  • 结构适用于通常不会修改的小型相关属性组。他们不支持继承。它们也是值类型(类是 ref 类型)。如果您的特殊情况涉及在对象使用过程中更改坐标值,则该结构并不理想。
  • 我打算让对象在某个时候改变位置......然后很可能会去上课......感谢您的澄清:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
相关资源
最近更新 更多