linQ学习笔记之三高级语句

linq语句查询执行的时机

第一步获取数据源

int [] obejct = new int[]{1,2,3,4,5,6,7,8,9}


第二步定义查询 

var even = numbers.where(p=>p%2==0).select(p=>{Console.WritLine("HI")})


第三步执行查询

foreach(var item in even ){}

定义查询后,查询直到需要枚举结果是才被真正执行,这种方式称为“”延迟执行“”

当查询方法返回单一值时,查询立即执行

因此,可以通过以下技巧在定义=查询时就强制执行查询

查询语句与查询方法存在着紧密方法

1.CLR本身并不理解查询语句,它只理解查询方法

2.编译器负责在编译时将查询语句翻译为查询方法

3.大部分查询方法都有对应的查询语句形式,例如select()对应select

4.部分查询方法目前在C#中还没有对应的查询语句:

入Count()和Max()这时只能采用以下替代方案

查询方法

查询语句 + 查询方法的混合方法

5.一般情况下,建议使用可读性更好的查询语句



高级查询方法

聚合类

Count , Max/Min ,Average

 int[] arr = {11,21,3,4,5,6,7,8,9,10,11,12,155 };
            
            //高级查询方法 聚合类
            Console.WriteLine("arr最大值" + arr.Max());
            Console.WriteLine("arr最小值" + arr.Min());
            Console.WriteLine("arr最平均值" + arr.Average());
            Console.WriteLine("arr数组长度" + arr.Count());
            Console.WriteLine("arr总和" + arr.Sum());


排序类

ThenBy

 int[] arr = {11,21,3,4,5,6,7,8,9,10,11,12,155 };
//排序类
            var arr1 = arr.OrderBy(p => p.ToString().Substring(0, 1));


分区类

Take, TaKeWhile, SKip, SKipWhile

 int[] arr = {11,21,3,4,5,6,7,8,9,10,11,12,155 };
//二次排序
            //var arr1 = arr.OrderBy(p => p.ToString().Substring(0, 1)).ThenBy(p => p);
            //arr1.Print();
            //var arr1 = arr.OrderBy(p => p.ToString().Substring(0, 1));//二次排序
            //var arr2 = from i in arr1 orderby i descending select i;
            //arr2.Print();


集合类

Distinct

//var arr1 = arr.Distinct();
            //arr1.Print(); 去掉相同的属性


生成类

Range ,Repeat

  //生成类--静态类
            //从10开始产生连续的50个数据
            var arr1 = System.Linq.Enumerable.Range(10,50);
            //生成重复的数据
            var arr2 = System.Linq.Enumerable.Repeat(DateTime.Now,50);
            arr1.Print();
            arr2.Print();

遍历的拓展方法

 /// <summary>
    /// 创建一个静态的类,拓展类
    /// </summary>
    public static class ExtraClass
    {
        /// <summary>
        /// 拓展方法 必须是静态的
        /// </summary>
        /// <param name="s">对哪一个属性进行的拓展</param>
        /// <returns></returns>
        public static string ToPascal(this string s)
        {
            return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
        }
        //为IEnumerable提供输出方法
        public static void Print(this IEnumerable ie)
        {
            IEnumerator IEU = ie.GetEnumerator();
            while (IEU.MoveNext())
            {
                Console.WriteLine(IEU.Current);
            }
        }

    }



总结

和其他几类方法不同,Range/Repeat 不是扩展方法,而是普通的静态方法

Range只能产生整数序列

Repenat 可以产生泛型序列

所有的查询方法都存放在System.Linq.Enumerable静态类中


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值