정렬
배열에는 다음과 같은 속성이 있습니다.
- 배열은 1차원, 다차원 또는 인터리브될 수 있습니다.
- 배열 인스턴스를 생성하면 위도 수와 각 위도의 길이가 설정됩니다. 이 값은 인스턴스 수명 동안 변경할 수 없습니다.
- 숫자형 배열 요소의 기본값은 0으로 설정되고 참조 요소는 null로 설정됩니다.
- 가변 배열은 배열의 배열이므로 해당 요소는 참조 유형이고 null로 초기화됩니다.
- 배열은 0부터 인덱싱됩니다. n 요소를 포함하는 배열은 0에서 n-1까지 인덱싱됩니다.
- 배열 요소는 배열 유형을 포함하여 모든 유형이 될 수 있습니다.
- 배열 유형은 추상 기본 유형 Array에서 파생된 참조 유형입니다. 모든 배열은 IList 및 IEnumerable을 구현합니다. foreach 문을 사용하여 배열을 반복할 수 있습니다. 1차원 배열은 IList 및 IEnumerable도 구현합니다.
배열은 정적으로 또는 암시적으로 정의될 수 있습니다.
1차원 배열
int[] array = new int[5];
int[] array1 = new int[] {
1, 3, 5, 7, 9 }; // 定长为5,不是动态的
int[] array2 = {
1, 3, 5, 7, 9 }; // 定长
string[] weekDays2 = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
다차원 배열
다른 언어의 배열 정의와 달리 다차원 배열 정의는 [,]
각 물음표에 대해 하나의 차원을 더 사용합니다. C#에서는 [][]
정의된 다차원 배열이 아니라 배열 내의 배열인 가변 배열(Jagged Array)입니다.
int[,] array = new int[4, 2]; //4 * 3 的二维数组
int[,,] array1 = new int[4, 2, 3]; // 4 * 2 * 3 的三维数组
다차원 배열을 명시적으로 정의하는 경우 모두 정의해야 합니다.
int[,] array2Da = new int[4, 2] {
{
1, 2 }, {
3, 4 }, {
5, 6 }, {
7, 8 } };
string[,] array2Db = new string[3, 2] {
{
"one", "two" }, {
"three", "four" },
{
"five", "six" } };
암시적 정의
int[,,] array3D = new int[,,] {
{
{
1, 2, 3 }, {
4, 5, 6 } },
{
{
7, 8, 9 }, {
10, 11, 12 } } };
레벨을 지정하지 않고 정의할 수 있습니다.
int[,] array4 = {
{
1, 2 }, {
3, 4 }, {
5, 6 }, {
7, 8 } };
들쭉날쭉한 배열
들쭉날쭉한 배열을 배열 내의 배열이라고 하며, 배열 내부에 여러 개의 배열이 정의되는 경우가 많습니다.
다음은 들쭉날쭉한 배열을 정의합니다. 첫 번째 배열은 []
내부에 세 개의 배열을 정의하고, 두 번째 배열은 []
내부 배열의 차원을 정의합니다. 여기에는 차원이 하나만 있습니다.
int[][] jaggedArray = new int[3][];
// 初始化,数组只需维度相同,元素数不定
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];
// 上述定义和下面语句相同
jaggedArray[0] = new int[] {
1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] {
0, 2, 4, 6 };
jaggedArray[2] = new int[] {
11, 22 };
선언할 때 초기화할 수도 있습니다.
// 交错数组new声明的第一个[]不定义数量
// 但是new声明的第二个[]必须定义维度数量
int[][] jaggedArray2 = new int[][]
{
new int[] {
1, 3, 5, 7, 9 },
new int[] {
0, 2, 4, 6 },
new int[] {
11, 22 }
};
// 定义的二维交错数组
int[][,] jaggedArray3 = new int[][,]
{
new int[,] {
{
1,2 }, {
3,3 }}
;
new 없이 선언할 수도 있습니다.
// 不使用new声明,定义时也需要数组同维度
int[][] jaggedArray4 =
{
new int[] {
1, 3, 5, 7, 9 },
new int[] {
0, 2, 4, 6 },
new int[] {
11, 22 }
};
요소 수와 배열 차원을 지정하여 다차원 배열을 정의하는 예
int[][,] jaggedArray5 = new int[3][,]
{
new int[,] {
{
1,3}, {
5,7} },
new int[,] {
{
0,2}, {
4,6}, {
8,10} },
new int[,] {
{
11,22}, {
99,88}, {
0,9} }
};
인덱서
인덱서를 사용하는 목적은 클래스의 비공개 배열 클래스에 액세스하는 것입니다. 그리고 인덱스에 액세스하기 위한 get
방법과 방법을 사용자 정의할 수 있습니다. set
인덱서는 클래스와 인터페이스에 정의될 수 있습니다.
인덱서의 유형과 해당 매개변수는 최소한 인덱서만큼 액세스 가능해야 합니다. 인덱서 값은 참조(ref 또는 out 매개변수)로 전달할 수 없습니다.
클래스의 인덱서
방법 1
class Parent
{
string[] s = {
"123", "222" };
public string this[int index]
{
get
{
return s[index];
}
set
{
s[index] = value;
}
}
}
void Start()
{
Parent p = new Parent();
Debug.Log(p[1]); // 222
p[1] = "555"; // 输入值默认value
Debug.Log(p[1]); // 555
}
인덱서를 사용하여 클래스의 요소(일반적으로 배열 요소는 일반적으로 인덱스를 통해 액세스하지만 일련 번호를 사용하여 int 유형의 n번째 숫자에 액세스하는 등 일련 번호가 필요한 다른 상황에서도 사용할 수 있음) 코스 열거 유형에 액세스할 수 있습니다.)
위 인덱서는 =>
get 및 set 메서드를 사용하여 설정할 수 있습니다.
class Parent
{
string[] s = {
"123", "222" };
public string this[int index]
{
get => s[index];
set => s[index] = value;
}
}
방법 2
다음 예에서는 인덱스 값을 이용하여 인덱스에 접근하고 있는데, 아래에 설정된 인덱서는 읽기 전용이며 인덱스 값을 통해 인덱스 번호에 접근하는 방식을 구현하고 있다.
class DayCollection
{
string[] days = {
"Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" };
public int this[string day] => FindDayIndex(day);
private int FindDayIndex(string day)
{
for (int j = 0; j < days.Length; j++)
{
if (days[j] == day)
{
return j;
}
}
throw new ArgumentOutOfRangeException(
nameof(day),
$"Day {
day} is not supported.\nDay input must be in the form \"Sun\", \"Mon\", etc");
}
}
void Start()
{
DayCollection Days = new DayCollection();
Debug.Log(Days["Sat"]);
}
접근자 get
와 set
메서드를 사용하여 인덱서(및 기타 변수)의 가독성과 쓰기 가능성을 정의합니다.
인터페이스의 인덱서
// Indexer on an interface:
public interface IIndexInterface
{
// Indexer declaration:
int this[int index]
{
get;
set;
}
}
// Implementing the interface.
class IndexerClass : IIndexInterface
{
private int[] arr = new int[100];
public int this[int index] // indexer declaration
{
// The arr object will throw IndexOutOfRange exception.
get => arr[index];
set => arr[index] = value;
}
}
위의 예에 따르면 IIndexInterface
인터페이스에 인덱서가 정의되어 있지만 인터페이스 자체에는 int 배열이 없습니다. 그리고 인터페이스에 get 및 set 권한이 정의된 경우 인덱서의 get 및 set은 상속된 클래스에서 구현되어야 합니다. 따라서 인덱서의 읽기 및 쓰기 권한이 인터페이스에 정의되었습니다.
IndexerClass
이 인터페이스를 상속하고 인터페이스에서 인덱서의 읽기 및 쓰기 접근자를 정의합니다.
동일한 이름을 가진 여러 인덱서가 상속되는 경우 물론 정규화된 이름을 사용하여 정의해야 합니다.
string IIndexInterface.this[int index]
{
}