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之类,没错~就是酱紫

还是看例子吧~ 

        string[] names = { "Tom""Dick""Harry""Mary""Jay" };//数据源
        
//找出names中以‘y’结尾的名字,很容易吧~
        IEnumerable<string> myQuery =
            from name 
in names
            
where name.EndsWith("y")
            select name;

然后可以这样取出来~

        foreach (var name in myQuery)
            Console.WriteLine(name.ToString());

由于受到老赵的影响,我发现自己现在更喜欢写Lambda表达式~

        myQuery = names
            .Where(name 
=> name.EndsWith("y"))
            .Select(name 
=> name);//更顺手,不是么~

来个稍微复杂点的:找出names中长度大于3,且名字全部转换成大写后包含大写“Y”的名字~

        myQuery = names
            .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#的时候,我会这样做:

        for (int i = 0; i < names.Length;i++ )
        {
            
if(i%2==0)
            {
                
//爱干嘛干嘛            
            }
        }

是的,没错,刚开始写c语言就是这么写的。但是大哥时代在进步啊,你好歹也得出来看看世界是个啥样子啊,你说局长日记你不知道没关系,但是你应该知道犀利哥,如果说你犀利哥也不知道,那你应该知道凤姐把~

            var myQuery = names
                .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

简单的查询就不多重复啦~就把自己学习的难点摆上来把~

            string[] strings = 
        {
            
"A penny saved is a penny earned.",
            
"The early bird catches the worm.",
            
"The pen is mightier than the sword." 
        };
            
//找出数组中所有单词转换成小写后以元音字母开头的单词

怎么写,这其实是MSDN上let关键字的一个例子,let的作用是将某些子结果集存储起来以便下文使用~

            var earlyBirdQuery =
                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个半小时...

            var lambdaQuery = strings
                .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 u in lambdaQuery)
                
foreach (var v in u)
                    Console.WriteLine(v.ToString());

 

后来发现用SelectMany就可以把它变成一个数组了~后面会说到这玩意~

写写Lambda发现真还挺有意思滴~

 

 

posted @ 2010-03-12 17:25  Tmac_  阅读(249)  评论(0)    收藏  举报