LINQ 基础知识 及 方法语法

原创 2012年03月27日 11:24:38

LINQ( Language Integrated Query )即语言集成查询
LINQ 是一组语言特性和API,使得你可以使用统一的方式编写各种查询。查询的对象包括XML、对象集合、SQL Server 数据库等等。

LINQ 主要包含以下三部分:
LINQ to Objects 主要负责对象的查询
LINQ to XML 主要负责 XML 的查询
LINQ to ADO.NET 主要负责数据库的查询
              LINQ to SQL
              LINQ to DataSet
              LINQ to Entities

如图:

 

LINQ查询的两种方式
1、Method Syntax 方法语法:利用扩展方法和Lamda表达式方式查询

2、Query  Syntax 查询语法:标准的LINQ查询运算符(优先选择)


class QueryVMethodSyntax
{
    static void Main()
    {
        int[] numbers = { 5, 10, 8, 3, 6, 12};

        //查询语法:
        IEnumerable<int> numQuery1 = 
            from num in numbers
            where num % 2 == 0
            orderby num
            select num;

        //方法语法:
        IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);

        foreach (int i in numQuery1)
        {
            Console.Write(i + " ");
        }
        Console.WriteLine(System.Environment.NewLine);
        foreach (int i in numQuery2)
        {
            Console.Write(i + " ");
        }

        // Keep the console open in debug mode.
        Console.WriteLine(System.Environment.NewLine);
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}
/*
    Output:
    6 8 10 12
    6 8 10 12
 */


一、初步体验

            int[] arr = { 20, 4, 51 };
            //得到数组中大于50的数
            IEnumerable ie = arr.Select(p => p).Where(p => p > 50);
            //输出
            IEnumerator result = ie.GetEnumerator();
            while (result.MoveNext())
            {
                Response.Write(result.Current);
            }


(1)、IEnumerable接口,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。

(2)、IEnumerator 集合访问器,没有它,就不能使用foreach语句遍历集合或数组。

       IEnumerator接口定义了一个Current属性,MoveNext和Reset两个方法。
           Current属性,来获取当前集合中的项吧。
           MoveNext方法只是将游标的内部位置向前移动(就是移到一下个元素而已),要想进行循环遍历,不向前移动一下怎么行呢?



二、拓展方法:对现有类提供额外的方法,增强类的功能。
              拓展方法是静态方法,必须写在静态类中。

    //拓展类只能是静态类
    public static class ExtraClass
    {
        //string的拓展方法--特殊的静态方法(this表示为string类型添加特殊的方法ToPascal)
        public static string ToPascal(this string s)
        {
            return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
        }
        //IEnumerable的拓展方法
        public static string Print(this IEnumerable<int> ie)
        {
            string str = "";
           IEnumerator<int> result= ie.GetEnumerator();
           while (result.MoveNext())
           {
               
               str+=result.Current+"|";  
           }
           return str;
        }
    }


            string str = "werwerwerw";
            Console.WriteLine(str.ToPascal());



三、Lambda表达式:没有参数的匿名方法
    历史:FrameWork1.0 委托---->FrameWork2.0 匿名方法--->FrameWork3.5 匿名方法--->Lambda表达式
1、FrameWork1.0 委托

    public delegate string deleTransfer(string s);//注意方法的签名
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //委托指向方法名
            deleTransfer trans = new deleTransfer(ToPascal);
            Response.Write(trans("FrameWork1.0 委托"));
        }

        public string ToPascal(string s)
        {
            return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
        }
    }

注:方法名可以随便

2、FrameWork2.0 匿名方法

    public delegate string deleTransfer(string s);
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            deleTransfer trans = delegate(string s){return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();};
            Response.Write(trans("FrameWork2.0 匿名方法"));
        }
    }

3、FrameWork3.5 匿名方法

    public delegate string deleTransfer(string s);
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            deleTransfer trans = (s)=>{return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();};
            Response.Write(trans("FrameWork3.5 匿名方法"));
        }
    }

4、Lambda表达式

    public delegate string deleTransfer(string s);
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {   //语法:(参数列表)=>{方法体};
            deleTransfer trans = s=>s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
            Response.Write(trans("Lambda表达式"));
        }
    }

四、LINQ基本方法语法方式
1、select/where 语句

    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            List<string> persons = new List<string>();
            persons.Add("zhang shan");
            persons.Add("zhang shan feng");
            persons.Add("li si");
            persons.Add("wang wu");
            //查询名称以zhang开头
            //var result = (from p in persons select p).Where(p => p.StartsWith("zhang"));
            var result = persons.Select(p => p).Where(p => p.StartsWith("zhang"));
            Label1.Text = result.Print();
        }
    }

    //拓展类只能是静态类
    public static class ExtraClassA
    {
        //IEnumerable的拓展方法
        public static string Print(this IEnumerable<string> ie)
        {
            string str = "";
            IEnumerator<string> result = ie.GetEnumerator();
            while (result.MoveNext())
            {

                str += result.Current + "|";
            }
            return str;
        }
    }

2、OrderBy排序

            //var result = persons.OrderBy(p => p);
            //按名字最后一个字母排序
            var result = persons.OrderBy(p => p.Substring(p.Length - 1, 1));
            //降序
            var result=persons.OrderByDescending(p=>p)


3、GroupBy分组

            List<string> persons = new List<string>();
            persons.Add("zhang shan");
            persons.Add("zhang shan feng");
            persons.Add("li si");
            persons.Add("wang wu");
            //按姓名分组,取出姓名中空格前的部分
            var result = persons.GroupBy(p => p.Split(new char[] { ' ' })[0]);
            foreach (var group in result)//外层循环得到分组            
            {
                Response.Write("姓:" + group.Key + "<br>");
                foreach (var name in group)//内层循环得到分组中的项               
                {
                    Response.Write(" " + name + "<br>");
                }
            }

 

 

LINQ 的更多资源
官方网站
http://msdn2.microsoft.com/zh-cn/netframework/aa904594(en-us).aspx
Hooked On LINQ
http://www.hookedonlinq.com/



五、高级查询方法

1、聚合类
Count,Max/Min,Average,Sum

//Count 返回集合项的数目
int count = (from p in foxRiver8
             where p.Age <= 30
             select p).Count();//混合模式

int count = foxRiver8
	.Where(p => p.Age <= 30)
	.Count();//纯粹查询方法模式


//Max 返回集合中的最大值
int maxAge = (from p in foxRiver8
	select p.Age).Max();

int maxAge = foxRiver8
	.Select(p => p.Age)
	.Max();


//Average 返回集合的平均值
double averageAge = (from p in foxRiver8
	select p.Age).Average();

double averageAge = foxRiver8
	.Select(p => p.Age)
	.Average();


//Sum 返回集合的总和
Int sumAge = (from p in foxRiver8
	select p.Age).Sum();

int sumAge = foxRiver8
	.Select(p => p.Age)
	.Sum();


2、排序类
ThenBy

//ThenBy 提供复合排序条件
var q = foxRiver8
	.OrderBy(p => p.FirstName)
    	.ThenBy(p => p.LasName)
    	.ThenBy(p => p.Age);//查询方法

var q = from p in foxRiver8
        orderby p.FirstName, p.LasName, p.Age
        select p;//查询语句


3、分区类
Take,TakeWhile,Skip,SkipWhile

Take 提取指定数量的项
Skip 跳过指定数量的项并获取剩余的项

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var q = numbers.Skip(1).Take(3);//跳过前1条记录,连续提取3条记录,得到 2 3 4

foreach (var item in q)
{
    Console.WriteLine(item);
}

TakeWhile 根据指定条件提取项
SkipWhile 根据指定条件跳过项

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var q = numbers.SkipWhile(i => i % 3 != 0)
    .TakeWhile(i => i % 2 != 0); 

foreach (var item in q)
{
    Console.WriteLine(item);
}


请判断以下代码输出结果是什么?请判断以下代码输出结果是什么?

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var q = numbers.Skip(1).Take(3).Skip(1).Take(2);
foreach (var item in q)
{
    Console.WriteLine(item);
}


输出: 3  4


4、集合类
Distinct

//Distinct 去掉集合中的重复项 
int[] factorsOf300 = { 2, 2, 3, 5, 5 };

var uniqueFactors = factorsOf300.Distinct();//输出: 2 3 5


 


5、生成类
Range, Repeat

//Range 生成一个整数序列 var numbers =Enumerable.Range(1, 5); foreach (var item in numbers) {     Console.WriteLine(item);//12345 }

//Repeat 生成一个重复项的序列 var numbers =  Enumerable.Repeat(“Beijing 2008”, 2); foreach (var item in numbers) {     Console.WriteLine(item);//Beijing 2008Beijing 2008 }

 

 


生成类查询方法小结
使用生成类查询方法时,需要注意以下几点:
和其他几类方法不同,Range/Repeat 不是扩展方法,而是普通的静态方法
Range 只能产生整数序列
Repeat 可以产生泛型序列
所有的查询方法都存放在 System.Linq.Enumerable 静态类中 

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

LINQ 基础知识 及 方法语法

LINQ( Language Integrated Query )即语言集成查询 LINQ 是一组语言特性和API,使得你可以使用统一的方式编写各种查询。查询的对象包括XML、对象集合、SQL Ser...

phalcon—— PHP基础知识(一)

一、变量和常量 1.1、变量名(标示符) 1)变量:$开头标志 2)变量名:可以由字母,数字,_ 3者组成,不能用数字开头 3)标识符是区分大小写的,但函数名不区分大小写。 4)变量名称可以与函数名称...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Smali语法基础知识

Types dalvik's bytecode has two major classes of types, primitive types and reference types. ...

Python 基础语法知识

原文地址:http://www.linuxidc.com/Linux/2011-04/34055.htm Python 随版本的不同,语法也有一些差异。 具体可以参考最新的Python帮助文档。 以...
  • tlb203
  • tlb203
  • 2012-07-16 11:25
  • 2348

OC基础语法知识

一. 基本概念    1. OC中没有命名空间机制,也没有包的概念,为了区分不同的类,在类名前加前缀    2. OC中的关键字都以@开头,用于区分C和C++的关键字,字符串也以@开头,比如: @in...

PHP 语法 基础知识

基本的 PHP 语法 PHP 的脚本块以 结束。您可以把 PHP 的脚本块放置在文档中的任何位置。 当然,在支持简写的服务器上,您可以使用 来开始和结束脚本块。 不过,为了达到最...

java基础知识---java语法基础

二:java语法基础:   1,关键字:其实就是某种语言赋予了特殊含义的单词。     保留字:其实就是还没有赋予特殊含义,但是准备日后要使用过的单词。 2,标示符:其实就是在程序中自定义的名...

PHP基础知识(一)——基础语法

1 标签 ,将PHP语句包含其中。 2 单行注释:// 3 多行注释:/*   */ 4 变量名以$起始 5 定义数组,array( ); <?php ...

Linq语法详细——基础语法

更多在 http://www.cnblogs.com/knowledgesea/p/3897665.html

第八周:数组(二)

5.5、二维数组的定义#include int main() { int fs[N][3]; int i,j; // int fs[3][3] ={{1,2,3},{4,5,...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)