C# foreach遍歷原理-建立列舉器實現遍歷(不使用foreach,實現遍歷)
昨天看了一下foreach實現原理(通過建立列舉器),今天將知識彙總下方便以後回頭看看,同時希望可以幫到更多的人。
廢話不多說,上正式解釋。
其實通過foreach遍歷資料,實際上是呼叫了一個“列舉器”來遍歷資料,和foreach一點關係都沒有,而foreach只是語法上的一個簡化而已。寫foreach只是降低列舉的複雜度,使程式設計師不用自己寫複雜的遍歷邏輯,只用呼叫foreach即可實現。
但是想我們這樣不平凡的人,怎麼甘願總用著foreach卻不懂其原理呢! 哈哈
上程式碼:
namespace FanXing
{
// 需要讓該型別實現一個叫IEnumerable的介面,並重寫GetEnumerator方法(注意重寫完此方法後,介面可刪除。其實需要的不是這個介面而是這個方法)
class ForeachFX : IEnumerable
{
string[] m_love = new string[] { "理智", "林青霞", "李若彤", "劉亦菲" };
// 這個方法的作用是獲取一個列舉器
public IEnumerator GetEnumerator()
{
return new ForeachEnumerator(this.m_love); // return一個ForeachEnumerator物件//throw new NotImplementedException();
}
}
// 這個型別就是一個列舉器
class ForeachEnumerator : IEnumerator
{
string[] m_love = null;
int index = -1; // 根據索引下標遍歷陣列,注意:下標一般都起到開始的前一個
public ForeachEnumerator(string[] m_love)
{
this.m_love = m_love;
}
public object Current // 當前值。如其所是為object型別
{
get
{
if(index >= 0 && index < m_love.Length)
{
return m_love[index];
}else
{
throw new IndexOutOfRangeException();
}
}
}
public bool MoveNext() // 獲取下一個
{
if(index + 1 < m_love.Length)
{
index++;
return true;
}
return false;
//throw new NotImplementedException();
}
public void Reset() // 將index重置為-1
{
index = -1;
}
}
}
main 函式程式碼:
ForeachFX foreachfx = new ForeachFX();
// 呼叫GetEnumerator方法,返回ForeachEnumerator物件傳給IEnumerator
IEnumerator ienumerator = foreachfx.GetEnumerator();
while (ienumerator.MoveNext()) // 呼叫MoveNext()方法,進行下一個
{
// 輸出Current
Console.WriteLine(ienumerator.Current.ToString());
}
// 重置,將index重置為-1
ienumerator.Reset();
Console.ReadKey();
如以上所示,就建立一個列舉器,通過以上列舉器就可以實現foreach的遍歷。而兩個類分別繼承的IEnumerable、IEnumerator介面,皆可刪除。介面中重寫的方法才是我們寫上介面的目的。