C#學習日記29----二維索引器 與 foreach遍歷索引器
來源:程序員人生 發(fā)布時間:2016-02-28 11:09:04 閱讀次數:2413次
上1篇結尾的時候我留下了幾個問題,由于要斷電了沒有解決,這1篇我們繼續(xù)上1篇的內容。點這里回到上1篇
問題1:
數組有多維度的,索引器也能夠是多維的嗎???
索引器可以是多維的,上1篇中我們定義的索引器只是1維索引器,同數組1樣可以定義多維索引器。比如我們索引電影院的1個放映室的坐位號,第1排第1列為1號,1排2列為2號……以下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test1
{//定義cinema類包括1個2維數組與1個2維訪問器
class cinema
{//定義1個2維數組
private string[,] seat = new string[5, 5];
//定義1個2維訪問器
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循環(huán)遍歷寫入
for (uint i = 1; i < 5; i++) { for (uint j = 1; j < 5; j++) { movieroom[i, j] = "第" + i + "排 第" + j + "列"; } } //for循環(huán)遍歷讀出 for (uint i = 1; i < 5; i++) { for (uint j = 1; j < 5; j++) { Console.WriteLine(movieroom[i,j]+" "+((i⑴)*4+j)+"號"); } } } } }
結果:
2維的索引器就是如此了,其他多維數的都以此類推,就不介紹了。
問題2:
數組能夠使用foreach語句進行簡單快捷的遍歷,索引器也能使用foreach語句遍歷么???
這個也是可以的,在解決這個問題的時候有必要弄清楚foreach的履行步驟與原理.
foreach語句:
C#中編譯器會把foreach語句轉化為IEnumerable接口的方法和屬性,比如:
string[] str = new string[] { "HC1", "HC2", "HC3", "HC4" };//定義1個數組
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" }; //定義1個數組
//調用GetEnumerator()方法,取得數組的1個枚舉
IEnumerator per = str.GetEnumerator();
//在while循環(huán)中,只要MoveNext()返回true,就1直循環(huán)下去
while (per.MoveNext())
{
//用Current屬性訪問數組中的元素
string p = (string)per.Current;
Console.WriteLine(p);
}
}
}
}
結果都1樣:
我們對string查看定義發(fā)現(xiàn),string繼承于IEnumerable接口,IEnumerable接口中只有1個方法GetEnumerator();(該方法已在string類中被實現(xiàn)了)該方法的作用是,返回1個循環(huán)訪問集合的枚舉器IEnumerator,我們在轉IEnumerator的定義,它也是1個接口,里面只有3個方法的聲明,Current(獲得集合中確當前元素),MoveNext(將枚舉數推動到集合的下1個元素,成功返回true,超出結尾返回false),Reset( 將枚舉數設置為其初始位置,該位置位于集合中第1個元素之前),也就是說,如果在我們自定義的類中沒有實現(xiàn)GetEnumerator方法,和Current、MoveNext方法,就不能使用foreach語句遍歷了。
foreach語句遍歷自定義類:
還是上面電影院的例子,不過這次我們不用for循環(huán)輸出,而是實現(xiàn)foreach語句遍歷輸出,以下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections; //添加這個很有必要
namespace Test1
{//定義cinema繼承IEnumerable接口實現(xiàn)GetEnumerator()功能
class cinema:IEnumerable
{//定義1個2維數組
private string[,] seat = new string[5, 5];
//定義坐位號碼
static public int index=⑴;
//定義1個2維索引器
public string this[uint a, uint b]
{
get { return seat[a, b]; }
set { seat[a, b] = value; }//set訪問器自帶value參數
}
//實現(xiàn)GetEnumerator方法
public IEnumerator GetEnumerator()
{
return new ienumerator(seat); //利用構造方法傳入seat參數
}
//由于上面返回值的需要所以繼承接口IEnumerator并實現(xiàn)方法
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]; }
}
//定義向下移動的規(guī)則
public bool MoveNext()
{
index++; //索引下1個坐位號的位置
if (index <= 15) { return true; } else return false; } //由于這個程序中用不到這個方法所以不實現(xiàn),但是必須得寫上否則會報錯 public void Reset() { } } } class Program { static void Main(string[] args) { cinema movieroom = new cinema();//實例化 //for循環(huán)索引寫入 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+" "+(cinema.index+1)+"號"); } } } }
結果:
結果是1樣的。。。。
版權聲明:本文為博主原創(chuàng)文章,未經博主允許不得轉載。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈