.Net迭代器新思路2012-01-04 blacktear 在通常的情况下,我们非常习惯于用foreach来迭代容器中的元素。虽然比起for循环来说,foreach可以让我们少打一些字母。如果我们有下面的需求:把一个整数的容器中所有元素乘2,然后保存在新的容器中,那么我们通常会写下下面的代码:
1int[] datas = { 1, 3, 2, 5, 7, 94, 1, 8, 42, 74, 8 };2ArrayList src = new ArrayList(datas);3ArrayList dest = new ArrayList();4foreach (object obj in src)5{6 dest.Add(((int)obj) * 2);7}8
对于表达来说,我们真正需要注意的是“dest.Add(((int)obj) * 2);”这行代码。而在这行代码中,最重要的是“((int)obj) * 2”代码。而剩下的代码仅仅是为了辅助完成上面的任务。真正在开发中,我们可能会经常遇到上面的命题。如果每次都来写foreach,然后是几行的辅助代码,确实感觉有点繁琐。那么我们有什么好的方法吗?能把foreach封装起来就好了。在.Net的System.Collections.Generic命名空间里,我们会发现List类有下面几个方法:ConvertAll 将当前 List 中的元素转换为另一种类型,并返回包含转换后的元素的列表。Find 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中的第一个匹配元素。FindAll 检索与指定谓词所定义的条件相匹配的所有元素。FindLast 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中的最后一个匹配元素。FindLastIndex 已重载。 搜索与指定谓词所定义的条件相匹配的元素,返回 List 或它的一部分中最后一个匹配项的从零开始的索引。ForEach 对 List 的每个元素执行指定操作。这些方法都有一个特殊的参数:代理。这些代理都是在System命名空间中声明的。下面我们还是沿用刚才的命题,用ConvertAll来写一段代码完成任务。
1int[] datas = { 1, 3, 2, 5, 7, 94, 1, 8, 42, 74, 8 };2List<int> src = new List<int>(datas);3List<int> dest = src.ConvertAll(delegate(int val)4{5 return val * 2;6});