C# 학습일지 29----2차원 인덱서 및 foreach 순회 인덱서

黄舟
풀어 주다: 2017-01-21 15:43:03
원래의
1601명이 탐색했습니다.

이전 글 말미에 전원이 끊기 직전이어서 해결되지 않은 몇 가지 질문을 남겼습니다. 이번 글에서는 이전 글의 내용을 이어가겠습니다. 이전 기사로 돌아가려면 여기를 클릭하세요

질문 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)+"号");               
                  
                }  
              
            }  
        }  
    }  
}
로그인 후 복사

결과:

C# 학습일지 29----2차원 인덱서 및 foreach 순회 인덱서

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);  
            }  
        }  
    }  
}
로그인 후 복사

결과는 동일합니다.

C# 학습일지 29----2차원 인덱서 및 foreach 순회 인덱서


문자열의 정의를 살펴본 결과 문자열이 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 순회 인덱서

결과는 동일합니다. . . .

위 내용은 C# 학습일지 29-2차원 인덱서와 foreach 순회 인덱서 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿