Foreach遍歷集合類原理

2021-05-31 22:56:23 字數 3878 閱讀 6946

下面的**示例闡釋如何編寫可與foreach一起使用的非泛型集合類。 該類是字串標記化拆分器,類似於 c 執行時函式 strtok_s。

1

using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;

5using

system.collections;67

namespace

macaco.study.consoleproject827

28///

29///

返回乙個迴圈訪問集合的列舉器。

30///

31///

可用於迴圈訪問集合的 system.collections.ienumerator 物件。

32public

ienumerator getenumerator()

3336

37///

38///

迴圈訪問集合的列舉器類

39///

40public

class

each_inheritenum:ienumerator

4156

57///

58///

返回當前索引所對應的物件

59///

60public

object

current

6163}64

65///

66///

設定下一輪迴圈的索引位置

67///

68///

返回是否繼續下一輪迴圈

69public

bool

movenext()

7076

else

7780}81

82///

83///

重置當前索引位置

84///

85public

void

reset()

8689}90

}91}92

在 c# 中,集合類不一定要從 ienumerable 和 ienumerator 繼承以便與 foreach 相容。 只要此類具有必需的 getenumerator、 movenext、 reset 和 current 成員,就可 foreach 與一起使用。 省略介面有乙個好處:您可以將 current 的返回型別定義得比 object 更為明確,從而提供型別安全。

例如以下**: 

1using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;56

namespace

macaco.study.consoleproject716

17///

18///

返回乙個迴圈訪問集合的列舉器。

19///

20///可用於迴圈訪問集合的each_noinheritenum物件。

21public

each_noinheritenum getenumerator()

2225

26///

27///

迴圈訪問集合的列舉器類

28///

29public

class

each_noinheritenum

3039

40///

41///

返回當前索引所對應的字串

42///

43public

string

current

4446}47

48public

bool

movenext()

4955

else

5659}60

61public

void

resset()

6265}66

}67}68

下現是呼叫這兩個集合類的主函式:

1using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;56

namespace

macaco.study.consoleproject714

private

static

void

each_test()

15);

1819

console.writeline(

"-------inherit result-------");

20foreach

(string

str 

inea)

2124

console.writeline(

"----------------------------");

2526

console.writeline();

2728

//該類沒有繼承自ienumerable,但是具有getenumerator方法

29each_noinherit eano 

=new

each_noinherit(

"this is each_no_inherit test", 

newchar

);30

31console.writeline(

"------no inherit result-----");

32foreach

(string

str 

ineano)

3336

console.writeline(

"----------------------------");

37}38/*

output:

39* -------inherit result-------

40*  this

41*  is

42*  each

43*  inherit

44*  test

45* ----------------------------

46* 

47* ------no inherit result-----

48*  this

49*  is

50*  each

51*  no

52*  inherit

53*  test

54* ----------------------------

55*/

5657

/*58

*第一種:實現ienumerable和ienumerator介面

59*第二種:不實現任何介面,但具備以上兩個介面中需要實現的方法

60*優缺點:

61*  1.第一種集合類能夠與其他公共語言執行時 相容語言的 foreach 語句或等效項互動操作,而第二種不能。 

62*  2.第一種集合類不可以將 current 的返回型別定義得比 object 更為明確,因此無法提供型別安全,

63*    而第二種集合類可以將current的返回定義為string從而能夠提供更好的型別安全。

64*/65}

66}67

foreach迴圈遍歷類陣列

using system using system.collections using system.collections.generic using system.linq using system.text using system.threading.tasks 使用foreach迴圈遍歷乙...

C 學習筆記(三) ForEach遍歷集合

1.foreach遍歷集合 1 簡單來說ienumerable是乙個宣告式的介面,宣告實現該介面的類就是 可迭代的enumerable 但並沒用說明如何實現迭代器 iterator 2 而ienumerator介面是實現式介面,它宣告實現該介面的類就可以作為乙個迭代器iterator.3 乙個col...

集合的基本方法和foreach遍歷

是list set 的父類。基本方法又add e e 新增,remove 李四 刪除 boolean型別 size 看大小 int 型別 contions 王五 是否包含 boolean型別 isempy 是否為空 boolean型別 collectioncoll new arraylisy 多型實...