雁过请留痕...
代码改变世界

Linq学习之旅——Linq to Objects之立即执行方法(下篇)

2012-08-11 21:20  xiashengwang  阅读(555)  评论(0编辑  收藏  举报

1,ElementAt 方法

2,ElementAtOrDefault 方法

3,All 方法

4,Any 方法

5,Contains 方法

6,Count 方法

7,LongCount 方法

8,Aggregate 方法

9,Sum 方法

10,Average 方法

11,Min 方法

12,Max 方法

1,ElementAt 方法

获取序列中指定索引的元素,如果索引超过范围将引发异常。

        private void ElementAtDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };

            var name = names.ElementAt(1);
            Console.WriteLine("index of 1 is:{0}", name);

            try
            {
                var name2 = names.ElementAt(10);//index超界了,异常
            }
            catch (ArgumentOutOfRangeException e)
            {
                Console.WriteLine(e.Message);
            }
            // index of 1 is:李莫愁
            //在 System.ArgumentOutOfRangeException 中第一次偶然出现的“mscorlib.dll”类型的异常
            //索引超出范围。必须为非负值并小于集合大小。
            //参数名: index
        }

2,ElementAtOrDefault 方法

获取序列中指定索引的元素。如果索引超过范围,将返回数组元素的默认值。

        private void ElementAtOrDefalutDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };

            var name = names.ElementAtOrDefault(1);
            Console.WriteLine("index of 1 is:{0}", name);//李莫愁

            try
            {
                var name2 = names.ElementAtOrDefault(10);//没有异常,返回string类型的默认值null
                Console.WriteLine("index of 10 is:{0}", name2);//name2=null
            }
            catch (ArgumentOutOfRangeException e)
            {
                Console.WriteLine(e.Message);
            }
        }

3,All 方法

序列中的全部元素都满足条件,返回true。否则为false。

        private void AllDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };

            var b = names.All(s => s.Length >= 2);//所有人的名字都大于等于2个字吗?
            Console.WriteLine(b);//true

            b = names.All(s => s.Length >= 3);//所有人的名字都大于等于3个字吗?
            Console.WriteLine(b);//false        
        }

4,Any 方法

检查序列中的元素是否存在满足条件

很显然,只要有一个满足条件,它都是true。一个都没有满足条件的为false。

        private void AnyDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };
            string[] emptys = { };
            var b1 = names.Any();
            var b2 = emptys.Any();
            var b3 = names.Any(s => s.IndexOf("") > -1);
            Console.WriteLine("b1={0}", b1);//true
            Console.WriteLine("b2={0}", b2);//false
            Console.WriteLine("b3={0}", b3);//true
        }

5,Contains 方法

确定元素是否在序列中。

        private void ContainsDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };

            var b1 = names.Contains("黄蓉");
            Console.WriteLine("b1={0}", b1);//true

            //注意:如果传入自定义的IEqualityComparer,可以改变相等性的判定
        }

6,Count 方法

获取序列元素的个数,或指定条件的元素的个数。

返回的类型是int32.

        private void CountDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };

            var cnt = names.Count();
            var cnt2 = names.Count(s => s.IndexOf("") > -1);
            Console.WriteLine("返回个数的类型是:{0},超过Int.MaxValue将会溢出报错", cnt.GetType().FullName);
            Console.WriteLine("cnt={0}", cnt);//5
            Console.WriteLine("cnt2={0}", cnt2);//2
            //返回个数的类型是:System.Int32,超过Int.MaxValue将会溢出报错
            //cnt=5
            //cnt2=2
        }

7,LongCount 方法

获取序列元素的个数,或指定条件的元素的个数。

返回的类型是int64.

        private void LongCountDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };

            var cnt = names.LongCount();
            var cnt2 = names.LongCount(s => s.IndexOf("") > -1);
            Console.WriteLine("返回个数的类型是:{0},超过Int64.MaxValue将会溢出报错", cnt.GetType().FullName);
            Console.WriteLine("cnt={0}", cnt);//5
            Console.WriteLine("cnt2={0}", cnt2);//2
            //返回个数的类型是:System.Int64,超过Int64.MaxValue将会溢出报错
            //cnt=5
            //cnt2=2
        }

8,Aggregate 方法

Aggregate用于将序列的元素进行累加。这里的累加和Sum有所不同,它能实现Sum的功能,也能实现字符串的累加等自定义操作。

它的英文是聚合的意思。

        private void AggregateDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };

            var concat = names.Aggregate((a, b) => string.Format("{0},{1}", a, b));

            Console.WriteLine(concat);
            //输出:
            //郭靖,李莫愁,欧阳晓晓,黄蓉,黄药师
        }

9,Sum 方法

计算数字序列的和。如果元素不是数字类型,可以利用转换函数,转换成数字类型在求和。

        private void SumDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };
            int[] lst1 = { 10, 20, 30 };
            int?[] lst2 = { 10, null, 30 };

            int i1 = lst1.Sum();
            int? i2 = lst2.Sum();

            var concat = names.Sum(s => s.Length);
            Console.WriteLine(i1);//60
            Console.WriteLine(i2);//40
            Console.WriteLine(concat);//14
        }

10,Average 方法

对数字类型的序列求平均值。

        private void AverageDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };//随意类型
            int[] lst1 = { 10, 20, 30 };//普通数字类型
            int?[] lst2 = { 10, null, 30 };//可空数字类型

            double i1 = lst1.Average();
            double? i2 = lst2.Average();

            var concat = names.Average(s => s.Length);
            Console.WriteLine(i1);//20
            Console.WriteLine(i2);//20 null的那个元素没计算到总个数中
            Console.WriteLine(concat);//2.8
        }

11,Min 方法

返回序列中得最小值。

如果元素是非数字的,只要实现了IComparabe<T>接口,就可以找出最小的值。

        private void MinDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };//随意类型
            int[] lst1 = { 10, 20, 30 };//普通数字类型
            int?[] lst2 = { 10, null, 30 };//可空数字类型

            double i1 = lst1.Min();
            double? i2 = lst2.Min();

            var concat = names.Min();
            Console.WriteLine(i1);//10
            Console.WriteLine(i2);//10 注意:null并不是最小值哦!
            Console.WriteLine(concat);//郭靖
        }

12,Max 方法

返回序列中得最大值。

如果元素是非数字的,只要实现了IComparabe<T>接口,就可以找出最大的值。

        private void MaxDemo()
        {
            string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };//随意类型
            int[] lst1 = { 10, 20, 30 };//普通数字类型
            int?[] lst2 = { 10, null, 30 };//可空数字类型

            double i1 = lst1.Max();
            double? i2 = lst2.Max();

            var concat = names.Max();
            Console.WriteLine(i1);//30
            Console.WriteLine(i2);//30 
            Console.WriteLine(concat);//欧阳晓晓
        }