이전 글 말미에 전원이 끊기 직전이어서 해결되지 않은 몇 가지 질문을 남겼습니다. 이번 글에서는 이전 글의 내용을 이어가겠습니다. 이전 기사로 돌아가려면 여기를 클릭하세요
질문 1:
배열은 다차원입니다. 인덱서도 다차원일 수 있나요? ? ?
인덱서는 다차원적일 수 있습니다. 이전 글에서 정의한 인덱서는 배열과 마찬가지로 1차원적 인덱서만 정의할 수 있습니다. 예를 들어 영화관 영사실 좌석번호를 색인화하면 첫 번째 행의 첫 번째 열은 1번, 첫 번째 행의 두 번째 열은 2번... 다음과 같습니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 {//定义cinema类包含一个二维数组与一个二维访问器 class cinema {//定义一个二维数组 private string[,] seat = new string[5, 5]; //定义一个二维访问器 public string this[uint a, uint b] { get { return seat[a, b]; } set { seat[a, b] = value; } } } class Program { static void Main(string[] args) { cinema movieroom = new cinema();//实例化 //for循环遍历写入 for (uint i = 1; i < 5; i++) { for (uint j = 1; j < 5; j++) { movieroom[i, j] = "第" + i + "排 第" + j + "列"; } } //for循环遍历读出 for (uint i = 1; i < 5; i++) { for (uint j = 1; j < 5; j++) { Console.WriteLine(movieroom[i,j]+"\t"+((i-1)*4+j)+"号"); } } } } }
결과:
2차원 인덱서의 경우도 마찬가지입니다. 다른 다차원 인덱서도 비슷하므로 소개되지 않습니다.
질문 2:
foreach 문을 사용하여 배열을 간단하고 빠르게 순회할 수 있습니다. foreach 문을 사용하여 인덱서도 순회할 수 있나요? ? ?
이 문제를 해결할 때는 foreach의 실행 단계와 원칙을 명확히 하는 것이 필요합니다.
foreach 문:
C#의 컴파일러는 문은
string[] str = new string[] { "HC1", "HC2", "HC3", "HC4" };//定义一个数组 foreach (string i in str)//使用foreach遍历 { Console.WriteLine(i); }
와 같은 IEnumerable 인터페이스의 메서드와 속성으로 변환됩니다. 그러나 foreach 문은 다음 코드 세그먼트로 구문 분석됩니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; //注意添加这个命名空间,否则没有IEnumerator这个类 namespace Example { class Program { static void Main(string[] args) { string[] str = new string[] {"HC1","HC2","HC3","HC4" }; //定义一个数组 //调用GetEnumerator()方法,获得数组的一个枚举 IEnumerator per = str.GetEnumerator(); //在while循环中,只要MoveNext()返回true,就一直循环下去 while (per.MoveNext()) { //用Current属性访问数组中的元素 string p = (string)per.Current; Console.WriteLine(p); } } } }
결과는 동일합니다.
문자열의 정의를 살펴본 결과 문자열이 IEnumerable 인터페이스 및 IEnumerable 인터페이스 GetEnumerator() 메서드는 하나만 있습니다(이 메서드는 문자열 클래스에서 구현되었습니다). 이 메서드의 기능은 컬렉션을 반복하는 열거자 IEnumerator를 반환하는 것입니다. 인터페이스이기도 한 IEnumerator의 정의에는 Current(컬렉션의 현재 요소 가져오기), MoveNext(열거자를 컬렉션의 다음 요소로 이동, 성공하면 true 반환, 성공하면 false 반환)라는 세 가지 메서드 선언만 있습니다. 끝을 초과함), 재설정(열거자를 컬렉션의 첫 번째 요소 앞의 초기 위치로 설정), 즉 GetEnumerator 메서드, Current 및 MoveNext 메서드가 사용자 지정 클래스에서 구현되지 않은 경우 foreach 문을 사용하여 순회할 수 없습니다.
foreach 문은 사용자 정의 클래스를 순회합니다.
여전히 위의 영화관 예이지만 이번에는 for 루프 출력을 사용하지 않고 foreach 문 순회 출력은 다음과 같습니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; //添加这个很有必要 namespace Test1 {//定义cinema继承IEnumerable接口实现GetEnumerator()功能 class cinema:IEnumerable {//定义一个二维数组 private string[,] seat = new string[5, 5]; //定义座位号码 static public int index=-1; //定义一个二维索引器 public string this[uint a, uint b] { get { return seat[a, b]; } set { seat[a, b] = value; }//set访问器自带value参数 } //实现GetEnumerator方法 public IEnumerator GetEnumerator() { return new ienumerator(seat); //利用构造方法传入seat参数 } //由于上面返回值的需要所以继承接口IEnumerator并实现方法 private class ienumerator:IEnumerator { private string[,] seats; //将传入的seat数组赋给它 public ienumerator(string[,] s) { seats = s; } //定义Current的只读属性 public object Current { //根据座位号推算数组的坐标也就是物理位置 get { return seats[1+(index/4), (index%4)+1]; } } //定义向下移动的规则 public bool MoveNext() { index++; //索引下一个座位号的位置 if (index <= 15) { return true; } else return false; } //因为这个程序中用不到这个方法所以不实现,但是必须得写上否则会报错 public void Reset() { } } } class Program { static void Main(string[] args) { cinema movieroom = new cinema();//实例化 //for循环索引写入 for (uint i = 1; i < 5; i++) { for (uint j = 1; j < 5; j++) { movieroom[i, j] = "第" + i + "排 第" + j + "列"; } } //调用foreach语句遍历输出 foreach (string i in movieroom) { Console.WriteLine(i+"\t"+(cinema.index+1)+"号"); } } } }
결과:
결과는 동일합니다. . . .
위 내용은 C# 학습일지 29-2차원 인덱서와 foreach 순회 인덱서 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!