Heim  >  Artikel  >  Backend-Entwicklung  >  C#-Lerntagebuch 29 ---- Zweidimensionaler Indexer und Foreach-Traversal-Indexer

C#-Lerntagebuch 29 ---- Zweidimensionaler Indexer und Foreach-Traversal-Indexer

黄舟
黄舟Original
2017-01-21 15:43:031594Durchsuche

Am Ende des vorherigen Artikels habe ich ein paar Fragen hinterlassen, die nicht gelöst wurden, weil der Strom kurz vor der Abschaltung stand. In diesem Artikel werden wir den Inhalt des vorherigen Artikels fortsetzen. Klicken Sie hier, um zum vorherigen Artikel zurückzukehren

Frage 1:

Arrays sind mehrdimensional. Können Indexer auch mehrdimensional sein? ? ?

Indexer können mehrdimensional sein. Der Indexer, den wir im vorherigen Artikel definiert haben, ist nur ein eindimensionaler Indexer. Wenn wir beispielsweise die Sitzplatznummer eines Vorführraums in einem Kino indizieren, ist die erste Spalte in der ersten Zeile Nr. 1 und die zweite Spalte in der ersten Zeile Nr. 2 ... wie folgt:

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)+"号");               
                  
                }  
              
            }  
        }  
    }  
}

Ergebnis:

C#-Lerntagebuch 29 ---- Zweidimensionaler Indexer und Foreach-Traversal-Indexer

Dies ist bei zweidimensionalen Indexern der Fall, die ähnlich sind und nicht vorgestellt werden.

Frage 2:

Arrays können einfach und schnell mit der foreach-Anweisung durchlaufen werden. Kann der Indexer auch mit der foreach-Anweisung durchlaufen werden? ? ?

Dies ist auch möglich, um die Ausführungsschritte und Prinzipien von foreach zu klären:

Der Compiler in C# Die Anweisung wird in die Methoden und Eigenschaften der IEnumerable-Schnittstelle konvertiert, wie zum Beispiel:

Die foreach-Anweisung wird jedoch in das folgende Codesegment analysiert.
string[] str = new string[] { "HC1", "HC2", "HC3", "HC4" };//定义一个数组  
            foreach (string i in str)//使用foreach遍历  
            {  
                Console.WriteLine(i);  
            }

Die Ergebnisse sind die gleichen:
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#-Lerntagebuch 29 ---- Zweidimensionaler Indexer und Foreach-Traversal-Indexer


Wir schauen uns die Definition von String an und finden diesen String erbt von der IEnumerable-Schnittstelle, GetEnumerator(); die Funktion dieser Methode besteht darin, einen Enumerator IEnumerator zurückzugeben, der die Sammlung durchläuft Wenn Sie die Definition von IEnumerator ändern, der auch eine Schnittstelle ist, gibt es nur drei Methodendeklarationen: Current (rufen Sie das aktuelle Element in der Sammlung ab), MoveNext (rücken Sie den Enumerator zum nächsten Element der Sammlung vor und geben Sie true zurück, wenn). erfolgreich, geben Sie false zurück, wenn das Ende überschritten wird), Zurücksetzen (setzen Sie den Enumerator auf seine Anfangsposition, die vor dem ersten Element in der Sammlung liegt), d. h. wenn die Methoden GetEnumerator, Current und MoveNext nicht implementiert sind In unserer benutzerdefinierten Klasse können wir die foreach-Anweisung nicht zum Durchlaufen verwenden.

Die foreach-Anweisung durchläuft die benutzerdefinierte Klasse:

Es ist immer noch das obige Kinobeispiel, aber dieses Mal verwenden wir nicht die for-Schleifenausgabe, sondern implementieren die foreach-Anweisungsdurchlaufausgabe wie folgt:

Ergebnis:
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#-Lerntagebuch 29 ---- Zweidimensionaler Indexer und Foreach-Traversal-Indexer Das Ergebnis ist das gleiche. . . .

Das Obige ist der Inhalt von C# Learning Diary 29 – zweidimensionaler Indexer und Foreach-Traversal-Indexer. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn