[C# 연구 노트] 배열 및 인덱서

여기에 이미지 설명을 삽입하세요.


정렬

배열에는 다음과 같은 속성이 있습니다.

  • 배열은 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"]);
}

접근자 getset메서드를 사용하여 인덱서(및 기타 변수)의 가독성과 쓰기 가능성을 정의합니다.


인터페이스의 인덱서

// 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]
{
    
    
}

추천

출처blog.csdn.net/milu_ELK/article/details/132121203