Maison > Article > développement back-end > Journal d'apprentissage C# 29 ---- Indexeur bidimensionnel et indexeur de parcours foreach
A la fin de l'article précédent, j'ai laissé quelques questions qui n'ont pas été résolues car le courant était sur le point d'être coupé. Dans cet article, nous continuerons le contenu de l'article précédent. Cliquez ici pour revenir à l'article précédent
Question 1 :
Les tableaux sont multidimensionnels, les indexeurs peuvent-ils aussi être multidimensionnels ? ? ?
Les indexeurs peuvent être multidimensionnels. L'indexeur que nous avons défini dans l'article précédent n'est qu'un indexeur unidimensionnel. Comme un tableau, un indexeur multidimensionnel peut être défini. Par exemple, si l'on indexe le numéro de place d'une salle de projection dans un cinéma, la première colonne de la première ligne est le n°1, et la deuxième colonne de la première ligne est le n°2... comme suit :
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)+"号"); } } } } }
Résultat :
C'est le cas des indexeurs bidimensionnels. D'autres indexeurs multidimensionnels sont similaires et ne seront pas présentés.
Question 2 :
Les tableaux peuvent être parcourus simplement et rapidement à l'aide de l'instruction foreach. L'indexeur peut-il également être parcouru à l'aide de l'instruction foreach ? ? ?
C'est également possible. Lors de la résolution de ce problème, il est nécessaire de clarifier les étapes d'exécution et les principes de foreach
instruction foreach :
Le compilateur en C#. L'instruction est convertie en méthodes et propriétés de l'interface IEnumerable, telles que :
string[] str = new string[] { "HC1", "HC2", "HC3", "HC4" };//定义一个数组 foreach (string i in str)//使用foreach遍历 { Console.WriteLine(i); }
Cependant, l'instruction foreach sera analysée dans le segment de code suivant.
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); } } } }
Les résultats sont les mêmes :
Nous regardons la définition de la chaîne et trouvons cette chaîne hérite de l'interface IEnumerable. Il n'y a qu'une seule méthode dans l'interface IEnumerable, GetEnumerator(); (cette méthode a été implémentée dans la classe string est de renvoyer un énumérateur IEnumerator qui parcourt la collection We). modifient la définition de IEnumerator, qui est également une interface, il ne contient que trois déclarations de méthode, Current (récupère l'élément actuel de la collection), MoveNext (avance l'énumérateur à l'élément suivant de la collection, renvoie true si réussi, renvoie false s'il dépasse la fin), Reset (définit l'énumérateur sur sa position initiale, qui est avant le premier élément de la collection), c'est-à-dire si les méthodes GetEnumerator, Current et MoveNext ne sont pas implémentées dans notre classe personnalisée, nous ne pouvons pas utiliser l'instruction foreach pour parcourir.
L'instruction foreach traverse la classe personnalisée :
C'est toujours l'exemple de cinéma ci-dessus, mais cette fois nous n'utilisons pas la sortie de la boucle for, mais implémentons la Sortie de parcours de l'instruction foreach, comme suit :
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)+"号"); } } } }
Résultat :
Le résultat est le même. . . .
Ce qui précède est le contenu du C# Learning Diary 29 - indexeur bidimensionnel et indexeur de traversée foreach Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !