LINQ之查询基础学习笔记(二)

来源:互联网 发布:oracle数据库卸载教程 编辑:程序博客网 时间:2024/06/02 16:02

LINQ查询方法的学习笔记:

     在LINQ中,数据源和查询结果实际上是Ienumerable<T>或IQueryable<T>类型的对象,所以可以用通过使用普通的对象形式对数据源或者查询结果进行操作。

Ienumerable<T>接口:

     该接口支持在指定的数据集合上进行迭代操作。在LINQ中,数据源实际上是实现了接口Ienumerable<T>的类,通过子句返回的查询结果也是实现了接口Ienumerable<T>的类。在.NET类库中提供了大量操作接口Ienumerable<T>的方法。

   1. Ienumerable<T>接口提供的方法分类:

                数值运算:

                                 成员                                                              功能                                    

                            Aggregate                        对序列应用累加器函数,可以指定累加方法  。

                                Sum                              计算序列中所有的元素和,返回值有int,doublie,long,float,类型。

                             Average                           计算元素平均值,返回值有int,doublie,long,float,类型。

                               Max                                 计算元素中的最大值,返回值有int,doublie,long,float,类型。

                               Min                                 计算元素中的最小值,返回值有int,doublie,long,float,类型。

                判断操作:

                                成员                                                              功能  
                                All                                  检查是否所有的元素都满足条件,可指定条件判断方法,返回false/true。

                                Any                                检查是否有一个元素满足条件,可指定条件判断方法,返回false/true。

                            Contains                          检查数据中是否包含特定元素,可以指定相等的比较方法。

                元素数量:

                                成员                                                              功能 

                               Count                             返回满足条件的元素个数,可指定判断方法。

                            LongCount                       返回满足条件的元素的长数量,可指定条件判断方法。                     

                取值:

                                 成员                                                              功能 

                                 First                               返回满足条件的第一个元素,可指定条件判断方法。

                                 Last                               返回满足条件的最后一个元素,可指定判断方法。

                                ElemnetAt                     返回指定索引出元素。

                提取子集:

                                  成员                                                              功能

                                  Skip                              剔除指定数量的元素,返回剩余元素。

                                SkipWhile                     剔除满足指定条件的元素,返回剩余元素,可指定判断条件的方法。

                                   Take                            从序号开头,返回指定数量的连续元素。

                                 TakeWhile                    返回满足条件的连续元素,可指定条件。

                集合操作:

                                  成员                                                              功能

                                Reverse                        反转序列中的元素顺序。

                                Distinct                          返回不重复的元素,可以指定相等的方法。

                                Concat                           连接两个序号,直接首尾连接。

                                Except                            获取两个元素的差集。

                                Intersect                        获取两个元素的交集。

                                 Union                            获取两个元素的并集。

                          SequenceEqual                比较两个序列是否相等,可指定判断方法。

                                  Where                         根据指定的条件对集合进行筛选。

                其他:

                                 成员                                                              功能                                    

                            Aggregate                        对序列应用累加器函数,可以指定累加方法  。

                              ToArray                            从Ienumerable<T>创建一个数组。

                             ToList                               从Ienumerable<T>创建一个List集合

               

2.查询表达式和方法之间的对应关系:

                              方法                                                                查询表达式关键字                                                                         功能                     

                            Cast()                                                          from 子句指定元素类型                                                 使用显示类型化的范围变量

                        GroupBy()                                                      group...by /group...by...into                                            对查询结果进行分组

                        GruopJoin()                                                    join ...in...on..equals...into                                             左外联接查询

                        Join()                                                                  join ...in...on..equals                                                  内部联接查询

                        OrderBy()                                                          ordery                                                                           升序排序

                      OrderByDescending                                        Orderby.....descending                                                降序排序

                       Select()                                                              select                                                                            指定影射元素

                       SelectMany()                                                     select                                                                             多个from 复合查询

                         TenBy()                                                               Orderby......,........                                                          多个元素排序,后一个元素升序

                        TenByDescending()                                          Orderby.....,....descending                                        多个元素排序,后一个降序

                        where()                                                                    Where                                                                           条件过滤


3.Lambda表达式在LINQ中的使用和说明:

       3.1.为什么在LINQ中使用Lambdba表达式:

                Lambda 表达式实际上是匿名函数,它可以赋值到一个委托,而在Ienumerable<T> 的方法中很多都是通过函数的委托来实现自定义运算,条件等操作。

      3.2. Lambda表达式的简单说明和使用:

            3.2.1.格式问题:

                         Lambda表达式实际上是一个匿名函数,包括表达式和语句,用于创建委托或者表达式目录树类型。运算符都为“=>”,运算符的右边是表达式或语句块,左边是输入参数(可能没有)。(input  param)=> expression

            3.2.2.参数问题:

                        在Lamdba表达式中只有一个输入参数的时候,括号可以省了,否则是必须要的。如果有两个参数或者更多参数的时候。在括号中用逗号隔开。(x,y)=>x+y

                        当Lamdba表达式中没有参数的时候,需要使用空括号表示,()=>AMethod()


4.方法的使用及代码:       

    ANLI1:

项目图:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LINQ2.Comparer
{
    class MyStrEqualityComparer : IEqualityComparer<string>
    {
        public bool Equals(string x, string y)
        {
            return x.Substring(0, 1) == y.Substring(0,1);
            throw new NotImplementedException();
        }

        public int GetHashCode(string obj)
        {
            return obj.Length;
            throw new NotImplementedException();
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LINQ2.Comparer
{
    /// <summary>
    /// 自定义的int类型比较器,实现IComparer<int>接口
    /// </summary>
    class MyIntComparer : IComparer<int>
    {
        /// <summary>
        /// 比较函数具体实现,对x,y的绝对值进行比较
        /// </summary>
        /// <returns></returns>
        public int Compare(int x, int y)
        {
            int x1 = Math.Abs(x);
            int y1 = Math.Abs(y);
            if (x1 > y1)
                return 1;
            else if (x1 == y1)
                return 0;
            else
                return -1;      
        }

      
    }
}

using LINQ2.Comparer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LINQ2
{
    class Program
    {
        static void Main(string[] args)
        {

          

            //创建数据源
            int[] intArry1 = { 1,2,3,4,5,6,7,8,9,15,20,25,5,40,40,45,50,-1,-2,-3,-5,-10,-15};
            string[] strArray1 = { "i","am","studying","LINQ"};
            string[] strArray2 = { "Day","by","day"};

            ////////////////////////////使用where()方法进行条件筛选/////////////////////////////////////

            //查询Q1通过Where()查询数据源intArry1所以能被5整除的元素
            var Q1 = intArry1.Where(num=>num%5==0);
            //打印结果:
            System.Console.Write("能被五整除的所有元素:");
            foreach(var val in Q1){
                System.Console.Write("{0},",val);
            }
            System.Console.WriteLine();

            //查询Q2通过Where()查询数据源intArry1中所有 值大于三倍索引的元素
            var Q2 = intArry1.Where((num,index)=>num>index*3);
            //打印结果:
            System.Console.Write("值大于三倍索引的元素:");
            foreach(var val in Q2){
                System.Console.Write("{0},",val);
            }
            System.Console.WriteLine();

            ////////////////////////////使用OrderBy()方法进行排序/////////////////////////////////////

 //1.简单排序表达式

            //查询Q3对数据源intArry1中所有的元素对10取余后升序
            var Q3 = intArry1.OrderBy(val=>val%10);
            //打印结果:
            System.Console.Write("简单排序:\n");
            System.Console.Write("元素10取余升序:");
            foreach(var val in Q3){
                System.Console.Write("{0},",val);          
            }
            System.Console.WriteLine();

            //查询Q4对数据源intArry1中所有的元素对10取余后降序
            var Q4 = intArry1.OrderByDescending(val=>val%10);
            //打印结果:
            System.Console.Write("元素10取余升序:");
            foreach (var val in Q4)
            {
                System.Console.Write("{0},", val);
            }
            System.Console.WriteLine();


 //2.自定义int比较器排序

            //创建自定义int选择器类对象
            MyIntComparer MIC = new MyIntComparer();
            //查询Q5对数据源intArry1中所有的元素使用自定义比较器后升序
            var Q5 = intArry1.OrderBy(val => val,MIC);
            //打印结果:
            System.Console.Write("自定义int选择器后升序:\n");
            foreach(var vla in Q5){
                System.Console.Write("{0},",vla);            
            }
            System.Console.WriteLine();


            //查询Q6对数据源intArry1中所有的元素使用自定义比较器后降序
            var Q6 = intArry1.OrderByDescending(val => val, MIC);
            //打印结果:
            System.Console.Write("自定义int选择器后降序:\n");
            foreach (var vla in Q6)
            {
                System.Console.Write("{0},", vla);
            }
            System.Console.WriteLine();

            ////////////////////////////使用Skip(),SkipWhile()跳过元素/////////////////////////////////////

            //查询Q7对数据源intArray1中跳过前3个元素的剩余元素
            var Q7 = intArry1.Skip(3);
            //打印结果:
            System.Console.Write("跳过前3个元素后的剩余元素:");
            foreach(var val in Q7){
                System.Console.Write("{0},",val);            
            }
            System.Console.WriteLine();

            //查询Q8对数据源intArray1中从第0个元素开始连续的绝对值大于10的元素剩余元素
            var Q8 = intArry1.SkipWhile(num=>num/10==0);
            //打印结果:
            System.Console.Write("连续绝对值小于10的剩余元素:");
            foreach (var val in Q8)
            {
                System.Console.Write("{0},", val);
            }
            System.Console.WriteLine();


            ////////////////////////////使用Take(),TakeWhile()提取元素/////////////////////////////////////

            //查询Q9对数据源intArray1中提取前3个元素
            var Q9 = intArry1.Take(3);
            //打印结果:
            System.Console.Write("前三个元素:");
            foreach(var val in Q9){
                System.Console.Write("{0},",val);
            }
            System.Console.WriteLine();

            //查询Q10对数据源intArray1中从第0个元素开始连续的绝对值于10的元素
            var Q10 = intArry1.TakeWhile(num=>num/10==0);
            //打印结果:
            System.Console.Write("连续绝对值小于10的元素:");
            foreach (var val in Q10)
            {
                System.Console.Write("{0},", val);
            }
            System.Console.WriteLine();

            ////////////////////////////使用Max()等方法进行数值计算/////////////////////////////////////

            //对数据源intArry1操作
            var intMax = intArry1.Max();         //最大值
            var intMin = intArry1.Min();         //最小值
            var intAvg = intArry1.Average();     //平均值
            var intSum = intArry1.Sum();         //总和
            //打印结果
            System.Console.WriteLine("数据源intArray1中最大值:{0},最小值:{1},平均值:{2},总和:{3}",intMax,intMin,intAvg,intSum);

            //对数据源strArray1操作
            var strMax = strArray1.Max();       //最大值
            var strMin = strArray1.Min();       //最小值
           //打印结果
            System.Console.WriteLine("数据源strArray1中最大值:{0},最小值:{1}",strMax,strMin);

    //对非数据类型求和,求平均等操作(重载,接受委托参数)
            //对数据源strArray1操作
            var StrMax = strArray1.Max(str=>str.Length);      //字符长度最长的元素长度最大值
            var StrMin = strArray1.Min(str=>str.Length);      //最小长度
            var StrAvg = strArray1.Average(str=>str.Length);  //平均长度
            var StrSum = strArray1.Sum(str=>str.Length);      //总长度
            //打印结果:
            System.Console.WriteLine("数据源strArray1中最大字符长度为:{0},最小字符长度:{1},平均字符长度:{2},字符长度总和:{3}",StrMax,StrMin,StrAvg,StrSum);

            ////////////////////////////使用Distinct消除集合中相等的元素/////////////////////////////////////
    //1.简单消除         

            //对查询结果消除相等元素
            var Q11 = intArry1.Distinct();
            //打印结果:
            System.Console.Write("消除后:");
            foreach(var val in Q11){
                System.Console.Write("{0}", val);
            }
            System.Console.WriteLine();
  //2.自定义消除
            //创建对象
            MyStrEqualityComparer MSEC = new MyStrEqualityComparer();

            //查询消除重复项
            var Q12 = strArray1.Distinct(MSEC);

            //打印结果:
            System.Console.Write("自定义消除后:");
            foreach (var val in Q12)
            {
                System.Console.Write("{0}", val);
            }
            System.Console.WriteLine();

            ////////////////////////////使用Concat()连接两个集合/////////////////////////////////////

            //连接数据源
            var Q13 = strArray1.Concat(strArray2);
            //打印结果:
            System.Console.Write("连接后:");
            foreach(var val in Q13){
                System.Console.Write(val);           
            }
            System.Console.WriteLine();

            System.Console.ReadLine();
        }
    }
}


运行结果:


                     

                   






























0 0