Abstract
傳統C/C++若要function傳回多值,會傳回array,C# 1.0會傳回array或ArrayList,C# 2.0呢?直覺學會想到List<T>,但其實使用Iterator更簡潔!!
Motivation
C# 2.0有四大新功能,泛型,Iterator,Anonymous Method和Partial Class。iterator可能是其中最怪異的新功能,除了苦思iterator的原理外,更是苦思如何應用在現實的代碼中。
Introduction
若要讓function傳回多值,C# 2.0很容易讓人想到使用List<T>,如square() function,無論傳入幾個值,就會傳出該值的平方,如square(1, 2, 3, 4)就會傳回1, 4, 9, 16,若用List<T>
1
/**/
/*
2
(C) OOMusou 2007 http://oomusou.cnblogs.com
3![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
4
Filename : FunctionReturnMultipleValueByListT.cs
5
Compiler : Visual Studio 2005 / C# 2.0
6
Description : Demo how to return mutiple values by List
7
Release : 06/22/2007 1.0
8
*/
9
using
System;
10
using
System.Collections.Generic;
11
![None.gif](/Images/OutliningIndicators/None.gif)
12
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
class
main
{
13![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static void Main()
{
14
foreach(int n in square(1,2,3,4))
15
Console.WriteLine(n);
16
}
17![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
18![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
static List<int> square(params int[] parms)
{
19
List<int> list = new List<int>();
20
foreach(int i in parms)
21
list.Add(i*i);
22
23
return list;
24
}
25
}
執行結果
以上代碼沒啥大問題,缺點在於List<T>大了點,較占內存,若只需簡單的傳回多個值,使用Iterator更加精簡有效率。
1
/**/
/*
2
(C) OOMusou 2007 http://oomusou.cnblogs.com
3![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
4
Filename : FunctionReturnMultipleValueByIterator.cs
5
Compiler : Visual Studio 2005 / C# 2.0
6
Description : Demo how to return mutiple values by List
7
Release : 06/22/2007 1.0
8
*/
9
using
System;
10
using
System.Collections;
11
![None.gif](/Images/OutliningIndicators/None.gif)
12
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
class
main
{
13![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static void Main()
{
14
foreach(int s in square(1,2,3,4))
15
Console.WriteLine(s);
16
}
17
18![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
static IEnumerable square(params int[] parms)
{
19
foreach(int n in parms)
20
yield return n*n;
21
}
22
}
23
執行結果
squre傳回IEnumerable,這就是一個iterator。yield的執行順序頗怪異,當foreach()第一次執行時,遇到yield return即傳回值,foreach()第二次執行時,則執行上次yield return的下一行,如此依序傳回多值。代碼內沒用到List<T>,當然也不需傳回List<T>,代碼行數和執行效率都遠勝於使用List<T>。
Conclusion
Iterator的應用當然不止於此,既然C#會讓yield單獨成為keyword,一定有其重要性,這個應用是我小小的心得,藉此拋磚引玉,希望能激發出Iterator更多的應用。