首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 2.0 新特性深度解析(四):泛型集合迭代器、yield break、多重迭代器與限制

     編輯:關於C語言

泛型集合上的迭代器

泛型鏈表範例:


class Node { public K Key; public T Item; public Node NextNode; }

public class LinkedList : IEnumerable
{
    Node _head;
    public IEnumerator GetEnumerator()
    {
        var cur = _head;
        while (cur != null)
        {
            yield return cur.Item;
            cur = cur.NextNode;
        }
    }
}

// 使用
var list = new LinkedList();
foreach (string s in list) Trace.WriteLine(s);

編譯器從 `IEnumerable` 推導 `foreach` 迴圈變數型別為 `T`。

提前終止:`yield break`


public IEnumerator GetEnumerator()
{
    for (int i = 1; i < 5; i++)
    {
        yield return i;
        if (i > 2) yield break; // 僅產生 1,2,3
    }
}

多重迭代器:同一集合不同遍歷順序

以屬性暴露:


public class CityCollection
{
    string[] _cities = {"New York","Paris","London"};
    public IEnumerable Reverse
    {
        get
        {
            for (int i = _cities.Length-1; i >= 0; i--)
                yield return _cities[i];
        }
    }
}
// 使用
foreach (string c in new CityCollection().Reverse) Trace.WriteLine(c);

`yield return` 使用限制

  1. 含 `yield` 的方法/屬性不可包含其他 `return`(會中斷迭代語意)。
  2. 不可用於匿名方法內部。
  3. 不可置於 `try` 區塊(含 `catch`/`finally`),但可置於 `try` 無 `catch` 的 `finally` 區塊外部。

違反限制導致編譯錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved