(原創) 如何使function傳回多值? (使用iterator) (.NET) (C#)

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 ExpandedBlockStart.gif ContractedBlock.gif /**/ /* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : FunctionReturnMultipleValueByListT.cs
 5InBlock.gifCompiler    : Visual Studio 2005 / C# 2.0
 6InBlock.gifDescription : Demo how to return mutiple values by List
 7InBlock.gifRelease     : 06/22/2007 1.0
 8ExpandedBlockEnd.gif*/

 9 None.gif using  System;
10 None.gif using  System.Collections.Generic;
11 None.gif
12 ExpandedBlockStart.gifContractedBlock.gif class  main  dot.gif {
13ExpandedSubBlockStart.gifContractedSubBlock.gif  public static void Main() dot.gif{
14InBlock.gif    foreach(int n in square(1,2,3,4))
15InBlock.gif      Console.WriteLine(n);
16ExpandedSubBlockEnd.gif  }

17InBlock.gif
18ExpandedSubBlockStart.gifContractedSubBlock.gif  static List<int> square(params int[] parms) dot.gif{
19InBlock.gif    List<int> list = new List<int>();
20InBlock.gif    foreach(int i in parms) 
21InBlock.gif      list.Add(i*i);
22InBlock.gif        
23InBlock.gif    return list;
24ExpandedSubBlockEnd.gif  }

25ExpandedBlockEnd.gif}


執行結果

None.gif 1
None.gif
4
None.gif
9
None.gif
16


以上代碼沒啥大問題,缺點在於List<T>大了點,較占內存,若只需簡單的傳回多個值,使用Iterator更加精簡有效率。

 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : FunctionReturnMultipleValueByIterator.cs
 5InBlock.gifCompiler    : Visual Studio 2005 / C# 2.0
 6InBlock.gifDescription : Demo how to return mutiple values by List
 7InBlock.gifRelease     : 06/22/2007 1.0
 8ExpandedBlockEnd.gif*/

 9 None.gif using  System;
10 None.gif using  System.Collections;
11 None.gif
12 ExpandedBlockStart.gifContractedBlock.gif class  main  dot.gif {
13ExpandedSubBlockStart.gifContractedSubBlock.gif  public static void Main() dot.gif{
14InBlock.gif    foreach(int s in square(1,2,3,4))
15InBlock.gif      Console.WriteLine(s);
16ExpandedSubBlockEnd.gif  }

17InBlock.gif    
18ExpandedSubBlockStart.gifContractedSubBlock.gif  static IEnumerable square(params int[] parms)dot.gif{
19InBlock.gif    foreach(int n in parms) 
20InBlock.gif      yield return n*n;
21ExpandedSubBlockEnd.gif  }

22ExpandedBlockEnd.gif}

23 None.gif


執行結果

None.gif 1
None.gif
4
None.gif
9
None.gif
16


squre傳回IEnumerable,這就是一個iterator。yield的執行順序頗怪異,當foreach()第一次執行時,遇到yield return即傳回值,foreach()第二次執行時,則執行上次yield return的下一行,如此依序傳回多值。代碼內沒用到List<T>,當然也不需傳回List<T>,代碼行數和執行效率都遠勝於使用List<T>。

Conclusion
Iterator的應用當然不止於此,既然C#會讓yield單獨成為keyword,一定有其重要性,這個應用是我小小的心得,藉此拋磚引玉,希望能激發出Iterator更多的應用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值