码迷,mamicode.com
首页 > 其他好文 > 详细

LinQ快速入门

时间:2014-11-24 19:11:57      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:linq   lambda   

(一)LINQ定义:


?LINQ(Language Integrated Query)即语句查询。LINQ主要包含三部分:LINQ to Object、LINQ TOXML和LINQ t to ADO.NET.


(二)LINQ初体验:


?拓展方法:目的对现有的类提供额外的方法增强该类的功能。

                   该类型的所有方法都可以使用这种方法。


我们都知道string类中有方法将字符串手写字母转化为大写字母(小写字母),我们用拓展方法-将字符串的首字母转化为大写字母的方法。

        private void btnExtramethod_Click(object sender, EventArgs e)
        {
            //拓展方法-----
            string s = "asdhasdh";
            Console.WriteLine(s.ToUpper());
            Console.WriteLine(s.ToLower());
            Console.WriteLine(s.ToPascal());
            Console.WriteLine(s.ToPascal(2)); 

        }

方法一:

         方法一:
        //将字符串的手写字母转化为大写字母的方法
        public string ToPascal( string s) //this后带类型,表明该类型添加拓展方法
        {
            return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
        }

方法二:定义一个静态类,在静态类中写:

   方法二:定义一个静态类,在静态类中写
    public static class ExtraClass
    { 
        //拓展方法--特殊的静态方法--为string类型添加特殊的方法ToPascal
        public static string ToPascal(this string s) //this后带类型,表明该类型添加拓展方法
        {
            return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
        }
        public static string ToPascal(this string s,int len) //this后带类型,表明该类型添加拓展方法
        {
            return s.Substring(0, 1).ToUpper() + s.Substring(1,len).ToLower() + s.Substring(len + 1);
        }
}

?拓展方法的缺点是:


1、拓展方法特定的命名空间内有效。

2、拓展方法的优先级低于同名的类方法。


?用LINQ的一个小Dome


我们写一段获取大于50的数,我们通常这样写:


int[] arr = { 123, 12, 3, 12, 15, 4, 5, 46, 47, 56, 176 };
            //获取大于50的数
            ArrayList result = new ArrayList();
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i] > 50)
                {
                    result.Add(arr[i]);
                }
            }
            //打印reult就OK了
            for (int i = 0; i < result.Count; i++) {
                Console.WriteLine(result);
            }

有了linq我们这样写:


            //获取到大于50的数
            IEnumerable ie = arr.Select(p => p).Where(p => p > 50);
            //输出---改代码可以复用
            IEnumerator result = ie.GetEnumerator();
            while (result.MoveNext())
            {
                Console.WriteLine(result.Current);
            }


(三)Lambda表达式:

?Lambda表达式是LINQ的基本语法。


?Lambda最基本的表达式如下:

             (参数列表)=>{方法体}


说明:参数类表中的参数类型可以是明确类型或者是推断类型。

              如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来。


?Lambda表达式的由来:


              Lambda表达式是有.net FrameWork1.0中委托的概念到2.0中的匿名方法过渡来的。


用.net FrameWork1.0中委托的概念:


定义一个委托:

public delegate string deleTransfer(string s);//注意方法签名

调用委托:

           //Linbda 来源
            //.netFramWork1.0委托。--函数指针
            deleTransfer trans = new deleTransfer(ToPascal);//委托指向方法topascal
            Console.WriteLine(trans("asdhasdh"));

ToPascal()方法见上面代码中的ToPascal(this string s)代码


.net FrameWork2.0匿名方法代码:

            //net framework 2.0匿名方法
            deleTransfer trans = delegate(string s)

            { return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower(); };  //与1.0不同的地方

个人理解为其实也是一种委托。


Lambda的表达式:

            //net framework 3.5匿名方法
            deleTransfer trans = s => s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
            Console.WriteLine(trans("ashadfh"));

我们可以从代码中看的出来,它在委托和匿名方法的基础上形成的Lambda语法。


Linq Lambda表达式可与查询操作符结合使用以代替委托。Linq Lambda表达式是创建委托实现的简略表达形式,并可用于匿名委托适用的所有场合。







LinQ快速入门

标签:linq   lambda   

原文地址:http://blog.csdn.net/qiumuxia0921/article/details/41448937

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!