跳到主要內容

發表文章

目前顯示的是 12月, 2017的文章

C# 中的Iterator (选代器)

C# 中的 Iterator(选代器) Iterator 是其中一種經常使用的設計模式。當你想列舉一個集合 而不想暴露它的細節時。Iterator 是合適的實現方法。 如大家曾編寫過Iterator 模式的話, 它的寫法 和以下代碼會有點兒相同。 以下是一個用來保存string 的Iterator 編寫一個正確的iterator 是非常沈悶的事。 概然 iterator 是那麼常用, 那應該把它寫在較底層的library 中。讓代碼能夠重用。才是上上之策。 考慮到這點, 其實C# 的團隊早已把Iterator 模式實現在C# 中 。 所以大家其實不需要自己編寫Iterator。 Iterator 的代碼早已定義在一個名為IEnumerator 的Interface 中。但我們要如何使用已定義好的代碼呢? 先看看List 類別的代碼。 從List 的代碼中看到, List 實現了IEnumerable 這個Interface。 在IEnumerable 中 定義了一個名為GetEnumerator 的方法。 該方法的返回類型是IEnumerator。 其實List 這個類別之所以能夠使用foreach來列舉,實際上就是因為它實現了IEnumerable 這個介面。 在實際編釋中,foreach 實際上是呼叫GetEnumerator 。在以下的例子中, 我實現了一個MessageBox 集合來保存類別為Message 的物件 例子 Message的定義 MesaageBox的定義 這時候, MessageBox 還未實現 IEnumerable Interface。 如在這時使用foreach 來列舉MessageBox的話 , 會出現編釋錯誤。 但當MesaageBox實現了IEnumerable 的話, 編譯錯誤就會消失。 最後在GetEnumerator 中加入以下代碼 便能夠使用foreach 列舉集合中的元素了。 當中yield 的意思是可以理解成先return 再執行的意思。所以執行結果會是在 顯示Before Yield 後顯示 "xxx give xxx a message.Content is xxx. It has n

C# XML(輸出教學)

C# XML 輸出教學 XML 是其中一種主流的數據儲存格式之一, 在C# 中, 大概有3種不同的寫法把數據輸出成XML 文件。 在本文中, 我會利用一個簡單的Window form 程式介紹這3種不同的寫法。  以下是範例的XML 格式 <Im>    <Number>xx</Number>    <Name> xxx</Name>    <Type> xxx <Type>    <Data> xxx </Data> </Im> 從以上的結構可輕易看得出, 這個範例是把一張圖片輸出成XML 格式。 這是範例中使用的圖片 成功輸出的XML 文件 在Chrome 中顯示 Window form 程式 XML 輸出方法 方法一 首先要介紹的寫法是利用XMLElement 的操作, 在XmlDocument 中構建XML 節點。 上述程式碼先構建一個全新的XmlDocument, 然後逐一構建節點。 最後把構建的節點放到對應的節點或XML Root 節點下。 成功構建後便使用XmlDocument 中的save 方法輸出XML 文件。 以上要注意的事是使用這種方法生成XML 的話, 如遇到要處理圖片的情況。 請先把圖片轉換成base64 字串後, 再放到節點的inner Text 中。 方法二 第二種方法是利用XmlTextWriter 把xml node 按順序寫入Filestream 中。 最後輸出成XML 文件。 程序碼如下, 和方法1相比, 如遇到要處理圖片的情況下, 則只需把圖片的binary data  放到byte 類型的數組中, 再利用XmlTextWriter中的WriteBase64 方法便可。 不用自行轉換成base64字串。 但要留意的事是 由於是使用XmlTextWriter 是把text 以串流的型式輸出。 所以寫入資料流 時最好要按Xml結構的順序寫入。 因為在串流中append 結構是比較困難的事。 方法三 最後一種方法是使用XML.Serialization 空間下的方法, 個人比