CSharp: Iterator Pattern in donet core 6

资源都来源于互联网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
   /// <summary>
   /// 迭代器模式  Iterator Pattern
   /// </summary>
   public interface IIterableCollection
   {
       /// <summary>
       ///
       /// </summary>
       /// <returns></returns>
       IIterator CreateIterator();
   }
 
 /// <summary>
   /// 迭代器模式  Iterator Pattern
   /// </summary>
   public class FestivalCollection : IIterableCollection
   {
 
       /// <summary>
       ///
       /// </summary>
       private readonly List<MusicFestival> _festivals = new();
       /// <summary>
       ///
       /// </summary>
       public int Count => _festivals.Count;
       /// <summary>
       ///
       /// </summary>
       /// <param name="festival"></param>
       public void Add(MusicFestival festival) => _festivals.Add(festival);
       /// <summary>
       ///
       /// </summary>
       /// <param name="index"></param>
       /// <returns></returns>
       public MusicFestival Get(int index) => _festivals[index];
       /// <summary>
       ///
       /// </summary>
       /// <returns></returns>
       public IIterator CreateIterator() => new FestivalIterator(this);
 
 
   }
 
   /// <summary>
   ///  迭代器模式  Iterator Pattern
   /// </summary>
   public interface IIterator
   {
       /// <summary>
       ///
       /// </summary>
       int Step { get; set; }
       /// <summary>
       ///
       /// </summary>
       /// <returns></returns>
       MusicFestival First();
       /// <summary>
       ///
       /// </summary>
       /// <returns></returns>
       MusicFestival Current();
       /// <summary>
       ///
       /// </summary>
       /// <returns></returns>
       bool MoveNext();
       /// <summary>
       ///
       /// </summary>
       void Reset();
 
   }
 
/// <summary>
   ///  迭代器模式  Iterator Pattern
   /// </summary>
   public class FestivalIterator : IIterator
   {
 
       /// <summary>
       /// /
       /// </summary>
       private readonly FestivalCollection _collection;
       /// <summary>
       ///
       /// </summary>
       private int _position;
       /// <summary>
       /// /
       /// </summary>
       private int _step;
       /// <summary>
       ///
       /// </summary>
       /// <param name="collection"></param>
       public FestivalIterator(FestivalCollection collection)
       {
           _collection = collection;
           _position = -1;
           _step = 1;
       }
 
       // It's probably more logical to have a method for changing the step.
       // However, for demo purposes the idea was to show that iterator interface can contain properties too.
       /// <summary>
       ///
       /// </summary>
       public int Step
       {
           get => _step;
           set
           {
               if (value <= 0)
               {
                   throw new ArgumentOutOfRangeException(nameof(value), "步长只能是正值。当前迭代器不支持倒退.");
               }
 
               _step = value;
           }
       }
       /// <summary>
       ///
       /// </summary>
       /// <returns></returns>
 
       public MusicFestival First()
       {
           _position = 0;
           return Current();
       }
       /// <summary>
       ///
       /// </summary>
       /// <returns></returns>
       public MusicFestival Current() => _collection.Get(_position);
       /// <summary>
       ///
       /// </summary>
       /// <returns></returns>
       public bool MoveNext()
       {
           var updatedPosition = _position + _step;
 
           if (updatedPosition < _collection.Count)
           {
               _position = updatedPosition;
               return true;
           }
 
           return false;
       }
       /// <summary>
       ///
       /// </summary>
       public void Reset() => _position = -1;
   }
 
 /// <summary>
   ///
   /// </summary>
   public class MusicFestival
   {
 
       /// <summary>
       ///  迭代器模式  Iterator Pattern
       /// </summary>
       /// <param name="name"></param>
       /// <param name="country"></param>
       public MusicFestival(string name, string country)
       {
           Name = name;
           Country = country;
       }
       /// <summary>
       ///
       /// </summary>
       public string Name { get; set; }
       /// <summary>
       ///
       /// </summary>
       public string Country { get; set; }
       /// <summary>
       ///
       /// </summary>
       /// <returns></returns>
       public override string ToString()
       {
           return $"姓名:{this.Name} 国家: {this.Country}";
       }
   }
 
 
 /// <summary>
   /// 迭代器模式  Iterator Pattern
   /// </summary>
   public static class MusicFestivalsExecutor
   {
 
       /// <summary>
       ///  迭代器模式  Iterator Pattern
       /// </summary>
       public static void Execute()
       {
           ConsoleExtension.WriteSeparator(" 迭代器模式  Iterator Pattern:Music festivals demo");
 
           var collection = new FestivalCollection();
 
           collection.Add(new MusicFestival("春", "中国"));
           collection.Add(new MusicFestival("四季之歌", "比利时"));
           collection.Add(new MusicFestival("春", "英国"));
           collection.Add(new MusicFestival("夏", "美国"));
           collection.Add(new MusicFestival("冬", "中国"));
 
           var iterator = collection.CreateIterator();
 
           Console.WriteLine("初始遍历.");
           Traverse(iterator);
 
           iterator.Reset();
           iterator.Step = 2;
 
           Console.WriteLine("\nT应跳过所有其他元素的第二个遍历.");
           Traverse(iterator);
       }
       /// <summary>
       ///
       /// </summary>
       /// <param name="iterator"></param>
       private static void Traverse(IIterator iterator)
       {
           while (iterator.MoveNext())
           {
               var festival = iterator.Current();
               Console.WriteLine($"音乐节 {festival.Name} 发生在{festival.Country}.");
           }
       }
   }

  

调用:

1
Geovin.Du.DuIterator.MusicFestivals.MusicFestivalsExecutor.Execute();

  

输出:

1
2
3
4
5
6
7
8
9
10
11
12
迭代器模式  Iterator Pattern:Music festivals demo
--------------------------------------------------
初始遍历.
音乐节 春 发生在中国.
音乐节 四季之歌 发生在比利时.
音乐节 春 发生在英国.
音乐节 夏 发生在美国.
音乐节 冬 发生在中国.
 
T应跳过所有其他元素的第二个遍历.
音乐节 四季之歌 发生在比利时.
音乐节 夏 发生在美国.

  

posted @   ®Geovin Du Dream Park™  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2021-12-18 java: MS Sql Server Connection using JDK 14.02
2011-12-18 User select font-face/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
2010-12-18 Pure CSS folded-corner effect(IE8以上,其他瀏覽器可以)
2010-12-18 Pure CSS speech bubbles(IE7以下無效,其他瀏覽器有效)
2010-12-18 Javascript Context Menu Ex - dhtml popup menu mode
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示