linq学习之道

本文介绍LINQ的基础使用方法及高级技巧,包括Lambda表达式、匿名函数、类型推断等,并通过多个实例演示如何高效地利用LINQ进行数据处理。

2012年3月14日 天气阴  要奋斗了

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Data;

namespace linq学习
{
    class Program
    {
        static void Main(string[] args)
        {
            /*===========================================实验1======================================================*/
            //int[] values = { 10, 5, 3, 20, 30, 4 };
            ////用lambda表达式实现
            //测试执行时间,不能同时测试,
            //Stopwatch sw = new Stopwatch();
            //sw.Start();
            //IEnumerable<int> e2 = values.Where(delegate(int i) { return i > 10; });//匿名函数
            //sw.Stop();
            //Console.WriteLine(sw.ElapsedTicks/1000d);
            //sw.Reset();
            //sw.Start();
            //IEnumerable<int> e1 = values.Where(i => i > 10);//lambda表达式
            ////用匿名函数实现
            //// IEnumerable<int> e2 = values.Where(delegate(int i){return i>10;});

            ////foreach (int i in e1)
            ////{
            ////    Console.WriteLine(i);
            ////}
            //sw.Stop();
            //Console.WriteLine(sw.ElapsedTicks/1000d);
            

            //foreach (int i in e2)
            //{
            //    Console.WriteLine(i);
            //}

            /*===========================================实验2======================================================*/

            ////var专门为匿名函数而生
            //var x=3;//通过右的类型判断他的定义类型
            ////x = "aaa";//会出现错误,”不能把一个string类对象显示转换为整形“
            //var p = new { age=3,name="tom"};//声明匿名类型的两个属性,通过反编译工具可以看到.net自动给我们生成了一个匿名类
            ////成员一致的匿名函数可以重用
            //var p = new { age=4,name="zhang"};
            //Console.WriteLine(p.name);

            /*===========================================实验3======================================================*/
            //int[] values = { 10, 5, -4, 10, 40, 23 };
            //用linq实现功能
            //过滤悼负数,数组排序,两边加'['']'
            //where过滤搜索,orderby排序,select将序列中每个元素投影到新表中
            //var e = values.Where(i => i > 0).OrderBy(i => i).Select(i => "[" + i + "]");
            //更简便的linq,看起来像sql语句,去除了lambda表达式
            //var e1 = from i in values
            //         where i > 0
            //         orderby i descending  //降序
            //         select "[" +i+"]";
            ////基于类型推断的考虑,from在前,select 在后

            //更简便的linq,看起来像sql语句,去除了lambda表达式
            //var e1 = from i in values
            //         where i > 0
            //         orderby i descending  //降序
            //         select new person { name="老"+i,age=i};
            //var e1 = values.Where(i => i > 0).OrderBy(i => i).Select(i => new person { name = "老" + i, age = i });
            //这一种方法有上面的看似sql语句的方法效率是一样的,因为从反编译工具中看到,编译器自动转换成看sql方法去执行
            ////基于类型推断的考虑,from在前,select 在后
            //foreach (var s in e1)
            //{
            //    Console.WriteLine(s.name);
            //}
            /*===========================================实验4======================================================*/
            ////把字符串长度为少于5的输出来,用linq实现
            //string[] values = {"tom","zhangshan","wangwu","heiliu","lisi" };
            //var e = from i in values
            //        where i.Length < 5
            //        select i;
            //foreach (var s in e)
            //{
            //    Console.WriteLine(s);
            //}
            /*===========================================实验5======================================================*/
            //一个字符串序列以整数形式存储,找出大于10的值
            //string[] values = { "100", "50", "360", "500", "30", "99" };
            //linq最终都编译成委托,所以可以调用.net函数
            ////var e = from str in values
            ////        where Convert.ToInt32(str) > 100
            ////        select Convert.ToInt32(str);
            //var e = from str in values
            //        let n=Convert.ToInt32(str)//声明一个临时变量
            //        where n> 100
            //        select n;
            //foreach (var s in e)
            //{
            //    Console.WriteLine(s);
            //}
            /*===========================================实验6======================================================*/
            //将一个姓名为key,年龄为value的Dictionary中找出大于20岁的人
            //按姓名+‘,’+年龄   输出
            //Dictionary<string, int> dt = new Dictionary<string, int>();
            //dt["tom"] = 15;
            //dt["zhang"] = 16;
            //dt["feng"] = 30;
            //dt["mo"] = 21;
            //dt["shi"] = 9;
            //dt["lei"] = 25;
            //dt["le"] = 32;
            //var e = from i in dt
            //        where i.Value > 20
            //        select i.Key + "," + i.Value;
            ////foreach (var s in e)
            ////{
            ////    Console.WriteLine(s);
            ////}
            //Console.WriteLine(string.Join(",",e.ToArray()));
            //Console.WriteLine("===============测试一下KeyValuePair====================");
            //foreach (KeyValuePair<string, int> i in dt)
            //{
            //    Console.WriteLine(i.Key + "," + i.Value);
            //}
            /*===========================================实验7======================================================*/
            //将此字符串“ajax,jqury,javascript”,每个单词加【】输出
            //string str = "ajax,jqury,javascript";
            //string[] values=str.Split(',');
            //var e=from i in values
            //      select "【"+i+"】";
            //Console.WriteLine(string.Join(",",e.ToArray()));
            /*===========================================实验7======================================================*/
            //linq只能用于范型的例子,对于非范型,可以用cast和oftype
            //下面是Ienumerable<T>的常用扩展方法
            //concat连接两个序列
            //contains序列是否包含指定元素
            //Distinct取得序列中非重复元素
            //Except获取两个序列的交集
            //First取得序列的第一个元素
            //Single取得序列的唯一一个元素,如果不是一个 则报错
            //cast<TResult>:由于Linq要针对范型类型操作,对于老版本.NET类等非范型
            //可以用cast转换成范型的序列,“ArrayList i; IEnumerable<int>=i.Cast<int>();”
            //OfType<TResult>:Cast会尝试将序列中的所有元素都转换为TResult类型,如果待转换的非范型序列中含有其他类型,则会报错
            //OfType则是只将序列中挑出指定类型转换到范型序列中
            //DataTable dt = null;//取出第一行
            //DataRow dr = null;
            ////常规方法
            //if (dt.Rows.Count > 0)
            //{
            //    dr = dt.Rows[0];
            //}
            ////linq方法
            //dr = dt.Rows.Cast<DataRow>().Single();

            //linq的效率怎么样
            //小数据量、对性能要求不高的环节用linq很方便,而且延迟加载机制降低了内存占用
            //比一般人写的程序 效率都高

            //取最大值,从下面4行中可以知道什么时候用cast,和oftype
            //object[] o = { 1,2,3,10,6,9};
            //Console.WriteLine( o.Cast<int>().Max());
            //object[] o = { 1, 2, 3, 10, 6, 9,"aaa" };
            //Console.WriteLine(o.OfType<int>().Max());//用cast会出错,oftype把数组中选择是int类型的选为序列,是为了挑出全适类型
            
            //结语 linq集范型,委托,扩展方法,lambda表达式等的集合
            //很方便的操作序列
            //用了这个,我们的速度增加了很多,编程水平就下降了许多(太他妈智能了)
            Console.Read();
        }
    }
    class person
    {
        public string name;
        public int age;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值