WEB开发网
开发学院软件开发C语言 c#扩展方法奇思妙用高级篇二:Aggregate扩展其改进... 阅读

c#扩展方法奇思妙用高级篇二:Aggregate扩展其改进

 2010-09-30 20:51:02 来源:WEB开发网   
核心提示: 也很简单吧,就是一个循环!前面lambda表达式中参数a, n 分别对应current, enumerator.Current,c#扩展方法奇思妙用高级篇二:Aggregate扩展其改进(4),对照一下,还是很好理解的,也可以甩开Select和Sum,更加精简一步了: public stati

也很简单吧,就是一个循环!前面lambda表达式中参数a, n 分别对应current, enumerator.Current,对照一下,还是很好理解的。

现在我们想求整数数组中位置为偶数的数的和(间隔求和),可以用Where配合Sum:

        public static void Test5()
        {
            int[] nums = new int[] { 10, 20, 30, 40, 50 };
            int sum1 = nums.Where((n, i) => i % 2 == 0).Sum();//10 + 30 + 50
        }

这个Where扩展设计的很好,它不但能带出某项的值“n”,还能带出项的位置“i”。

Aggregate可不行!我们来改进一下:

        //改进的Aggerate扩展(示例代码,实际使用请添加空值检查)
        public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, int, TSource> func)
        {
            int index = 0;
            using (IEnumerator<TSource> enumerator = source.GetEnumerator())
            {
                enumerator.MoveNext();
                index++;
                TSource current = enumerator.Current;
                while (enumerator.MoveNext())
                    current = func(current, enumerator.Current, index++);
                return current;
            }
        }

改进后的Aggregate更加强大,前面的求偶数位置数和的算法可以写成下面的样子:

        public static void Test6()
        {
            int[] nums = new int[] { 10, 20, 30, 40, 50 };
            int sum2 = nums.Aggregate((a, c, i) => a + i%2 == 0 ? c : 0 );//10 + 30 + 50
        }

可能不够简洁,但它一个函数代替了Where和Sum。所在位置“i“的引入给Aggregate带来了很多新的活力,也增加了它的应用范围!

我随笔《使用“初中知识”实现查找重复最优算法 + 最终极限算法》中最后提出的“最终极限算法”,用上这里改进的Aggregate扩展,也可以甩开Select和Sum,更加精简一步了:

        public static void Test7()
        {
            //1~n放在含有n+1个元素的数组中,只有唯一的一个元素值重复,最简算法找出重复的数
            int[] array = new int[] { 1, 3, 2, 3, 4, 5 };
            //原极限算法
            int repeatedNum1 = array.Select((i, j) => i - j).Sum();
            //最新极限算法
            int repeatedNum2 = array.Aggregate((a, n, i) => a + n - i);
        }

上一页  1 2 3 4 

Tags:扩展 方法 奇思

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接