扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:佚名 来源:msdn 2007年11月13日
关键字:
可以使用新的C#的yield return语句告诉编译器产生什么。例如,下面的代码显示了如何在city集合中使用C#迭代器来代替图2中的人工实现部分:
public class CityCollection : IEnumerable<string>
{
string[] m_Cities = {"New York","Paris","London"};
public IEnumerator<string> GetEnumerator()
{
for(int i = 0; i<m_Cities.Length; i++)
yield return m_Cities[i];
}
}
此外,您还可以在非泛型集合中使用C#迭代器:
public class CityCollection : IEnumerable
{
string[] m_Cities = {"New York","Paris","London"};
public IEnumerator GetEnumerator()
{
for(int i = 0; i<m_Cities.Length; i++)
yield return m_Cities[i];
}
}
此外,还可以在如图4所示的在完全泛型(Fully Generic)集合中使用C#迭代器。当使用泛型集合和迭代器时,从声明的集合(本例中的string)中,编译器就可以检索到foreach循环内IEnumerable<ItemType>所用的特定类型:
LinkedList list = new LinkedList();
/* Some initialization of list, then */
foreach(string item in list)
{
Trace.WriteLine(item);
}
图4在普通链表中使用迭代程序
//K is the key, T is the data item
class Node<K,T>
{
public K Key;
public T Item;
public Node<K,T> NextNode;
}
public class LinkedList<K,T> : IEnumerable<T>
{
Node<K,T> m_Head;
public IEnumerator<T> GetEnumerator()
{
Node<K,T> current = m_Head;
while(current != null)
{
yield return current.Item;
current = current.NextNode;
}
}
/* More methods and members */
}
这与其他任何从泛型接口派生的相似。如果想中止迭代,请使用yield break语句。例如,下面的迭代器将仅仅产生数值1、2和3:
public IEnumerator GetEnumerator()
{
for(int i = 1;i< 5;i++)
{
yield return i;
if(i > 2)
yield break;
}
}
这样,集合可以很容易地公开多个迭代器,每个迭代器都用于以不同的方式遍历集合。例如,要以倒序遍历CityCollection类,在这个类中提供了IEnumerable<string>类型的Reverse属性,它是
public class CityCollection
{
string[] m_Cities = {"New York","Paris","London"};
public IEnumerable Reverse
{
get
{
for(int i=m_Cities.Length-1; i>= 0; i--)
yield return m_Cities[i];
}
}
}
这样就可以在foreach循环中使用Reverse属性:
CityCollection collection = new CityCollection();
foreach(string city in collection.Reverse)
{
Trace.WriteLine(city);
}
使用yield return语句是有一定限制的。包含yield return语句的方法或属性不能再包含其他return语句,否则会出现迭代中断并提示错误。不能在匿名方法中使用yield return语句,也不能将yield return语句放到带有catch块的try语句中(同样,也不能放在catch块或finally块中)。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者