自定义一个可以使用foreach语句进行迭代的类(IEnumerable)

  在c#中,凡是实现了IEnumerable接口的数据类型都可以用foreach语句进行迭代访问。所以,我们要定义一个可以使用foreach进行迭代访问的类,就必须要实现IEnumerable接口。

 1 // 摘要:
 2 //     公开枚举器,该枚举器支持在非泛型集合上进行简单迭代。
 3 public interface IEnumerable
 4 {
 5     // 摘要:
 6     //     返回一个循环访问集合的枚举器。
 7     //
 8     // 返回结果:
 9     //     可用于循环访问集合的 System.Collections.IEnumerator 对象。
10     [DispId(-4)]
11     IEnumerator GetEnumerator();
12 }

  在IEnumerable中,只有一个GetEnumerator方法,而GetEnumerator返回一个IEnumerator对象,所以要看下IEnumerator的定义。

 1     // 摘要:
 2     //     支持对非泛型集合的简单迭代。
 3     public interface IEnumerator
 4     {
 5         // 摘要:
 6         //     获取集合中的当前元素。
 7         //
 8         // 返回结果:
 9         //     集合中的当前元素。
10         //
11         // 异常:
12         //   System.InvalidOperationException:
13         //     枚举器定位在该集合的第一个元素之前或最后一个元素之后。- 或 -在创建了枚举器后集合被修改了。
14         object Current { get; }
15 
16         // 摘要:
17         //     将枚举器推进到集合的下一个元素。
18         //
19         // 返回结果:
20         //     如果枚举器成功地推进到下一个元素,则为 true;如果枚举器越过集合的结尾,则为 false。
21         //
22         // 异常:
23         //   System.InvalidOperationException:
24         //     在创建了枚举器后集合被修改了。
25         bool MoveNext();
26         //
27         // 摘要:
28         //     将枚举器设置为其初始位置,该位置位于集合中第一个元素之前。
29         //
30         // 异常:
31         //   System.InvalidOperationException:
32         //     在创建了枚举器后集合被修改了。
33         void Reset();
34     }

  IEnumerator中有Current属性和MoveNet、Reset两个方法,所以要定义一个类来继承IEnumerator并实现这些方法属性。

  通过IEnumerable和IEnumerator定义可以看出要实现foreach迭代,我们要定义两个对象,一个实现接口IEnumerable,一个实现接口IEnumerator,IEnumerable中的GetEnumerator()看作IEnumerator object的factory method 也未尝不可。

 1 class CatArray : IEnumerable {
 2     private string[] cats = { "Kiky", "Mary", "Lily", "Garfield" };
 3     public IEnumerator GetEnumerator() {
 4         return new CatEnumerator(cats);
 5     }
 6 }
 7 class CatEnumerator : IEnumerator {
 8     private string[] _cats = null;
 9     public CatEnumerator(string[] cats) {
10         _cats = cats;
11     }
12     private int index = -1;
13     public object Current {
14         get { return _cats[index]; }
15     }
16     public bool MoveNext() {
17         if (++index < _cats.Length) {
18             return true;
19         } else {
20             return false;
21         }
22     }
23     public void Reset() {
24         index = -1;
25     }
26 }
27 private void Button_Click_3(object sender, RoutedEventArgs e) {
28     CatArray cats = new CatArray();
29     foreach (string cat in cats) {
30         tb3.Text += cat + "";
31     }
32 }

 

 

 

 

转载于:https://www.cnblogs.com/qq278360339/p/3223319.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值