LINQ Operators -1
最近看了拯救C# 2.0,但是我们真做的到吗?,从.NET中委托写法的演变谈开去(中):Lambda表达式及其优势,从CSDN的趣味题学C# 3.0等文章之后,突然之间觉得代码也可以写的这样干净利落。最让人惊奇的是,Lambda表达式竟然可以如此漂亮,发现自己平常些的代码是多么的丑陋啦~(连缀太TM的帅啦~)
4.0就在眼前,可我大部分还在写2.0的东西,可悲可悲...为了我也能写出这样“帅”的代码,我也开始学LINQ吧,园子里一搜,发现教程还不少,LINQ体验系列文章导航算的上典范,其实这2天的学习,一直用LINQPad这个小玩意,相对于理论知识,我更倾向于实际操作,通过一个个小例子去掌握每一个运算符的用法,而linqpad正是这样学习Linq的一大利器,可以直接运行LINQ的语句以及Lambda表达式,当然也可以查看对应LINQ语句的Lambda表达式,甚至可以查看对应的SQL语句,还可以查看IL代码,实乃杀人越货,居家旅行必备呀~哇哈哈....
写本文的目的也就是记下自己学习的心得啦,巩固一下这几天学的东西。
1.Filtering
筛选,过滤,一开始我就会想到SQL语句中where,in,not in,exist之类,没错~就是酱紫
还是看例子吧~
//找出names中以‘y’结尾的名字,很容易吧~
IEnumerable<string> myQuery =
from name in names
where name.EndsWith("y")
select name;
然后可以这样取出来~
Console.WriteLine(name.ToString());
由于受到老赵的影响,我发现自己现在更喜欢写Lambda表达式~
.Where(name => name.EndsWith("y"))
.Select(name => name);//更顺手,不是么~
来个稍微复杂点的:找出names中长度大于3,且名字全部转换成大写后包含大写“Y”的名字~
.Where(name => name.Length > 3)
.Select(name => name.ToUpper())
.Where(name => name.Contains("Y"));//只写Lambda表达式啦
发现这种要长度怎么怎么样,以什么结尾,以什么开头,包含什么不,以什么什么分割,只要按部就班,对准题意,一个条件一个条件写下来就ok.
比如现在就可以写:找出names中长度小于5转换成小写后后再替换字母“aeiou”为空格后以“y”开头以"z"结尾,且包含“abc”.........的名字
变一下:返回names中index为偶数的名字:
刚开始写c#的时候,我会这样做:
{
if(i%2==0)
{
//爱干嘛干嘛
}
}
是的,没错,刚开始写c语言就是这么写的。但是大哥时代在进步啊,你好歹也得出来看看世界是个啥样子啊,你说局长日记你不知道没关系,但是你应该知道犀利哥,如果说你犀利哥也不知道,那你应该知道凤姐把~
.Where((n,i)=>i%2==0);
挺犀利的把~的确是挺优雅的~实际Where中是应用了一个Func<(Of <(T1, T2, TResult>)>) 委托作为筛选条件,所以会如此简洁。
其他的应用诸如Contains,StartsWith,Like,Min,Any,Take,Skip,TakeWhile,SkipWhile,Distinct,First,Last,ElementAt等等看个例子便知了~
2.Select
简单的查询就不多重复啦~就把自己学习的难点摆上来把~
{
"A penny saved is a penny earned.",
"The early bird catches the worm.",
"The pen is mightier than the sword."
};
//找出数组中所有单词转换成小写后以元音字母开头的单词
怎么写,这其实是MSDN上let关键字的一个例子,let的作用是将某些子结果集存储起来以便下文使用~
from sentence in strings
let words = sentence.Split(' ')//首先将数组存起来
from word in words
let w = word.ToLower()//然后将数组中的每个单词存起来
where w[0] == 'a' || w[0] == 'e'
|| w[0] == 'i' || w[0] == 'o'
|| w[0] == 'u'
select word;
那么Lambda表达式该怎么写呢~这正式俺郁闷的地方啊,小人不才实在愚笨,这个表达式写了将近1个半小时...
.Select(sentence => sentence
.Split()
.Select(word=>
new
{
word = word,//由于最后选择的是原始单词,所以在这里要保留备份
singleChar = word.ToLower()[0]
})
.Where(c=>tempData.singleChar=='a'||tempData.singleChar=='e'||tempData.singleChar=='i'||tempData.singleChar=='o'||tempData.singleChar=='u')
.Select(tempData=>tempData.word));
-其实发现写这玩意最重要的能够判断上文的结果集,所谓的tempData就是保存了上文的结果集,下文才有word以及singleChar。所以tempData保存的singleChar用于filtering,word用于最后的select.
结果嘛成了一个数组的数组,取出来还得要这样~
foreach (var v in u)
Console.WriteLine(v.ToString());
后来发现用SelectMany就可以把它变成一个数组了~后面会说到这玩意~
写写Lambda发现真还挺有意思滴~
浙公网安备 33010602011771号