2016-11-11 1 views
0

2 차원 배열 속성을 사용하여 클래스를 만들려고합니다. 배열은 그리드 (예 : 0,1 또는 3,7)에서 다양한 x, y 좌표를 유지하며 배열 크기는 size라는 클래스 속성에 따라 다릅니다.2D 배열을 클래스 속성으로 - 어떻게 C# 방식으로 만들 수 있습니까?

어떻게하면 C#에서이 배열을 만들겠습니까? 아래에 제 솔루션을주었습니다. C# 경험이 거의없고 자바 스크립트 지식이있는 Python 배경에서 나오는 것처럼이 문제에 대한 더 나은 해결책이있는 것처럼 느껴집니다.

당신 중 하나가 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; 
     } 
    } 
+0

또한 배열을 사용하는 대신 좌표를 갖는 클래스를 만듭니다. 예를 들어 두 속성 X와 Y를 가진'Coordinate' 클래스가 있습니다. 그러면 좌표의 1D 배열을 만듭니다. –

+0

FYI : C#에서는 속성이 꽤 다른 것입니다. 여기서 사용해야하는 용어는 * field *입니다. 또한 배열을 만드는 것처럼 보이므로 질문이 명확하지 않습니다. 너 좀 정교 할 수있어? – Amy

+0

작성한 코드가 잘못되지 않았습니다. 그것은 2D 배열을 만드는 방법이지만, x, y 좌표를 저장하기 때문에'Point's의 1D 배열을 만들 수 있습니다 (또는 x와 y 값을 저장하기 위해 구조체를 직접 만들면됩니다). C# 속성 및 인덱서에 대해 배울 수 있습니다. –

답변

1

구조체처럼

이 이상적인 방법입니다. 완전한 수업은 필요하지 않을 수도 있지만, 그 종류에 달려 있습니다.

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

+1

제안 해 주셔서 감사합니다. 나는 항상 클래스가 구조체가하고있는 모든 일을 할 때 Structs가 있는지 궁금해왔다. 왜 그런지 알고 있는가? – Nebelhom

+2

구조체는 일반적으로 수정되지 않는 작고 관련된 관련 그룹을 대상으로합니다. 그들은 상속을 지원하지 않습니다. 또한 값 유형이기도합니다 (클래스는 ref 유형 임). 특정 용도로 개체 사용 과정에서 좌표 값을 변경하는 경우 구조체가 실제로 이상적인 것은 아닙니다. –

+0

나는 어떤 점에서 위치를 바꾸는 것을 목표로한다. 그러면 가장 많은 수업을 듣게 될 것이다 ... 명확히 해 주셔서 감사합니다 :) – Nebelhom

2

당신은 대신 클래스의 목록을 작성하고 포인트를 표현하기 위해 내부 하위 클래스를 할 수 :

여기 내 코드입니다. 이

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; 
     } 
    } 
+0

당신의 제안에 감사드립니다! :) 배열을 통해 목록을 사용하면 어떤 이점이 있습니까? 리스트가 미리 정의 된 최대 길이가없는 배열이라는 것을 알았습니까? – Nebelhom

+0

크기를 변경할 때 동적으로 메모리를 할당합니다 (올바르게). 즉 개발자가 메모리 정리에 대해 걱정할 필요가 없다는 의미입니다. 고정 배열이 필요하다고 가정 해 보겠습니다. C#의 IEnumerable 프로토 타입 덕분에 myList.ToArray()를 수행 할 수 있습니다. –

관련 문제