题目1:
数组有多维度的,索引器也可所以多维的吗???
索引器可所以多维的,上一篇中我们定义的索引器只是一维索引器,同数组一样可以定义多维索引器。比方我们索引电影院的一个放映室的坐位号,第一排第一列为1号,一排2列为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:
数组可以运用foreach语句举行简朴快速的遍历,索引器也能运用foreach语句遍历么???
这个也是可以的,在处理这个题目的时刻有必要弄清楚foreach的实行步骤与道理.
foreach语句:
C#中编译器会把foreach语句转化为IEnumerable接口的要领和属性,比方:
string[] str = new string[] { "HC1", "HC2", "HC3", "HC4" };//定义一个数组 foreach (string i in str)//运用foreach遍历 { Console.WriteLine(i); }
然则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); } } } }
效果都一样:
我们对string检察定义发明,string继续于IEnumerable接口,IEnumerable接口中只要一个要领GetEnumerator();(该要领已在string类中被完成了)该要领的作用是,返回一个轮回接见鸠合的罗列器IEnumerator,我们在转IEnumerator的定义,它也是一个接口,内里只要三个要领的声明,Current(猎取鸠合中的当前元素),MoveNext(将罗列数推进到鸠合的下一个元素,胜利返回true,超出末端返回false),Reset( 将罗列数设置为其初始位置,该位置位于鸠合中第一个元素之前),也就是说,如果在我们自定义的类中没有完成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----二维索引器 与 foreach遍历索引器的内容,更多相关内容请关注ki4网(www.ki4.cn)!