旗下导航:搜·么
当前位置:网站首页 > .Net教程 > 正文

C#进修日志29----二维索引器 与 foreach遍历索引器【C#.Net教程】,C#,二维索引器,foreach遍历

作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:15评论:0


导读:上一篇末端的时刻我留下了几个题目,因为要断电了没有处理,这一篇我们继续上一篇的内容。点这里回到上一篇题目1:数组有多维度的,索引器也可所以多维的吗???索引器可...
上一篇末端的时刻我留下了几个题目,因为要断电了没有处理,这一篇我们继续上一篇的内容。点这里回到上一篇

题目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)!

标签:C#二维索引器foreach遍历


欢迎 发表评论: