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;
}
}