天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品

系列文章導(dǎo)航:

走進(jìn)Linq--Linq橫空出世篇

走進(jìn)Linq-輝煌的背后

走進(jìn)Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴(kuò)展方法

不能不說的C#特性-匿名方法和Lambda表達(dá)式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品

不能不說的C#特性-迭代器(下),yield以及流的延遲計(jì)算

走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇

走進(jìn)Linq-Linq to Objects(下)實(shí)例篇

走進(jìn)Linq-Linq to SQL感性認(rèn)識篇

走進(jìn)Linq-Linq to SQL How do I(1)

走進(jìn)Linq-Linq to SQL How do I(2)

走進(jìn)Linq-Linq to SQL How do I(3)

走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)

走進(jìn)Linq-Linq to SQL源代碼賞析 Table的獲取過程

走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化

走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq


提到迭代器我們不能不想到迭代器模式,那我就以迭代器模式作為開場白。

在我們的應(yīng)用程序中常常有這樣一些數(shù)據(jù)結(jié)構(gòu):

它們是一個數(shù)據(jù)的集合,如果你知道它們內(nèi)部的實(shí)現(xiàn)結(jié)構(gòu)就可以去訪問它們,它們各自的內(nèi)部存儲結(jié)構(gòu)互不相同,各種集合有各自的應(yīng)用場合.說到這里大家可能想出一大堆這樣的集合了:List,Hashtable,ArrayList等等。這些集合各自都有各自的個性,這就是它們存在的理由。但如果你想遍歷它你必須知道它內(nèi)部的存儲細(xì)節(jié),作為一個集合元素,把內(nèi)部細(xì)節(jié)暴露出來肯定就不好了,這樣客戶程序就不夠穩(wěn)定了,在你更換集合對象的時候,比如List不能滿足需求的時候,你換成Hashtable,因?yàn)橐郧暗目蛻舫绦蜻^多的關(guān)注了List內(nèi)部實(shí)現(xiàn)的細(xì)節(jié),所以不能很好的移植。而迭代器模式就是為解決這個問題而生的:

提供一種一致的方式訪問集合對象中的元素,而無需暴露集合對象的內(nèi)部表示。

比如現(xiàn)在有這樣一個需求,遍歷集合內(nèi)的元素,然后輸出,但是并不限定集合是什么類型的集合,也就是未來集合可能發(fā)生改變。

思考:

集合會發(fā)生改變,這是變化點(diǎn),集合改變了,遍歷方法也改變,我們要保證遍歷的方法穩(wěn)定,那么就要屏蔽掉細(xì)節(jié)。找到了變化點(diǎn)那我們就將其隔離起來(一般使用interface作為隔離手段):假設(shè)所有的集合都繼承自ICollection接口,這個接口用來隔離具體集合的,將集合屏蔽在接口后面,作為遍歷我們肯定需要這樣一些方法:MoveNext,Current,既然ICollection負(fù)責(zé)數(shù)據(jù)存儲,職責(zé)又要單一,那么就新建立一個接口叫做Iterator吧,每種具體的集合都有自己相對應(yīng)的Iterator實(shí)現(xiàn):

下面是一個簡易的實(shí)現(xiàn)代碼:

/// 
/// 集合的接口
/// 
    public interface ICollection
    {
        
int Count { get; }
        
/// 
        
/// 獲取迭代器
        
/// 
        
/// 迭代器
        Iterator GetIterator();
    }
    
/// 
    
/// 迭代器接口
    
/// 
    public interface Iterator
    {
        
bool MoveNext();

        
object Current { get; }
    }

    
public class List : ICollection
    {
        
private const int MAX = 10;
        
private object[] items;
        
public List()
        { 
            items 
= new object[MAX];
        }
        
public object this[int i]
        {
            
get { return items[i]; }
            
set { this.items[i] = value; }
        }
        
#region ICollection Members

        
public int Count
        {
            
get { return items.Length; }
        }

        
public Iterator GetIterator()
        {
            
return new ListIterator(this);
        }

        
#endregion
    }
    
public class ListIterator : Iterator
    {
        
private int index = 0;
        
private ICollection list;
        
public ListIterator(ICollection list)
        {
            
this.list = list;
            index 
= 0;
        }
        
#region Iterator Members

        
public bool MoveNext()
        {
            
if (index + 1 > list.Count)
                
return false;
            
else
            { 
                index
++;
                
return true;
            }
        }

        
public object Current
        {
            
get { return list[index]; }
        }

        
#endregion
    }
    
/// 
    
/// 測試
    
/// 
    public class Program
    {
        
static void Main()
        {
            ICollection list 
= new List();
            Iterator iterator 
= list.GetIterator();
            
while (iterator.MoveNext())
            {
                
object current = iterator.Current;
            }
        }
}

系列文章導(dǎo)航:

走進(jìn)Linq--Linq橫空出世篇

走進(jìn)Linq-輝煌的背后

走進(jìn)Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴(kuò)展方法

不能不說的C#特性-匿名方法和Lambda表達(dá)式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品

不能不說的C#特性-迭代器(下),yield以及流的延遲計(jì)算

走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇

走進(jìn)Linq-Linq to Objects(下)實(shí)例篇

走進(jìn)Linq-Linq to SQL感性認(rèn)識篇

走進(jìn)Linq-Linq to SQL How do I(1)

走進(jìn)Linq-Linq to SQL How do I(2)

走進(jìn)Linq-Linq to SQL How do I(3)

走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)

走進(jìn)Linq-Linq to SQL源代碼賞析 Table的獲取過程

走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化

走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq


看看最后的測試,是不是不管具體的集合如何改變,遍歷代碼都非常穩(wěn)定?而且擴(kuò)展新的集合類也非常方便,只是添加代碼不會修改原來的代碼,符合開閉原則。當(dāng)然,這么好的解決方案微軟當(dāng)然不會放過,現(xiàn)在C# 2.0里已經(jīng)內(nèi)置了對迭代器的支持,看看System.Collections, System.Collections.Generic命名空間,所有的集合都實(shí)現(xiàn)了這個接口:IEnumerable,這個接口還有泛型的版本。注意到這個接口只有一個方法:IEnumerator GetEnumerator();,IEnumerator就是迭代器的接口,相當(dāng)于我的實(shí)例里面的Iterator,它也有泛型的版本。

那么現(xiàn)在在.NET里所有的集合類都可以這樣訪問了:

IEnumerator ienumerator = list.GetEnumerator();
while(ienumerator.MoveNext())
{
    
object current = ienumerator.Current;
}

系列文章導(dǎo)航:

走進(jìn)Linq--Linq橫空出世篇

走進(jìn)Linq-輝煌的背后

走進(jìn)Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴(kuò)展方法

不能不說的C#特性-匿名方法和Lambda表達(dá)式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品

不能不說的C#特性-迭代器(下),yield以及流的延遲計(jì)算

走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇

走進(jìn)Linq-Linq to Objects(下)實(shí)例篇

走進(jìn)Linq-Linq to SQL感性認(rèn)識篇

走進(jìn)Linq-Linq to SQL How do I(1)

走進(jìn)Linq-Linq to SQL How do I(2)

走進(jìn)Linq-Linq to SQL How do I(3)

走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)

走進(jìn)Linq-Linq to SQL源代碼賞析 Table的獲取過程

走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化

走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq


調(diào)用迭代器的MoveNext()方法,L_004e: brtrue.s L_0036 如果是true的話跳轉(zhuǎn),

L_0036: ldloc.2 
L_0037: callvirt instance object [mscorlib]System.Collections.IEnumerator::get_Current()
L_003c: stloc.1 
L_003d: ldloc.1 
L_003e: callvirt instance string [mscorlib]System.Object::ToString()
L_0043: call void [mscorlib]System.Console::WriteLine(string)

it知識庫不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产在线一卡二卡 | 双腿打开揉弄高潮H苏安安秦慕深 | 午夜爽喷水无码成人18禁三级 | 真人美女精美小穴 | 亚洲日本va中文字幕久久 | 亚洲国产日韩欧美视频二区 | 二级毛片在线观看 | 內射XXX韩国在线观看 | 国产精品久久欧美一区 | 国产综合欧美区在线 | 麻豆高潮AV久久久久久久 | 久久内在线视频精品mp4 | 日本美女靠逼 | 灌满内射HP1V1| 国产永不无码精品AV永久 | 中文天堂www资源 | 国产日韩精品SUV | 国产全部视频列表支持手机 | 少爷被多个暗卫肉高h | 国产日韩亚洲精品视频 | 99精品在线看 | 日本漫画之无彩翼漫画 | 果冻传媒视频在线播放 | 国产噜噜噜精品免费 | 极品少妇高潮XXXXX | 热九九99香蕉精品品 | 国产香蕉视频在线观看 | 伊人久久中文大香线蕉综合 | 亚洲精品国产在线观看 | 无码一区二区在线欧洲 | 韩国伦理电影在线神马网 | 亚洲精品在线影院 | 摸董事长的裤裆恋老小说 | 亚洲国产精品特色大片观看 | 强上轮流内射高NP男男 | 日韩视频中文在线一区 | 国产在线观看免费观看不卡 | 久久午夜夜伦鲁鲁片无码免费 | 67194免费入口 | 免费xxx成年大片 | 二级毛片免费观看全程 |