技术开发 频道

内存对象查询的HelloWorld程序


【IT168技术文档】

  在展示这段简单的代码之前,书上特意提到了LINQ所需的编译和运行环境要求。大家都知道,LINQ是.NET 3.5中自带的一组升级功能,其实指的是编译器和类库(.NET FX),而不是运行环境(.NET CLR),这就意味着我们用LINQ编写的项目经过编译后,能正常地在.NET 2.0上运行。后来在脚注下标出来说,LINQ to SQL至少要运行在.NET 2.0 SP1之上。
  
  废话说完,开始经典HelloWorld的代码。
1namespace HelloWorld 2{ 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 string[] words = { "Hello", "Wonderful", "Linq", "Beautiful", "World" }; 8 9 var groups = 10 from word in words 11 orderby word ascending 12 group word by word.Length into lengthGroups 13 orderby lengthGroups.Key descending 14 select new { Length=lengthGroups.Key, Words=lengthGroups}; 15 16 foreach (var group in groups) 17 { 18 Console.WriteLine("Words of Length " + group.Length); 19 foreach (var word in group.Words) 20 Console.WriteLine(" " + word); 21 } 22 23 Console.ReadLine(); 24 } 25 } 26}
  入门的代码都不难,那我还需要说什么呢?是我从这段代码中看到了使用LINQ强大的灵活性和可扩展性。
  
  其实在这之前还有一个更简单的例子,只是选择了数组中长度小于等于5的单词并输出。但是做过项目的同事就很清楚,客户往往有一些诡异和变幻莫测的需求,他现在不满足于只看到“hello linq world”,而是要想看到所有长度下对应的每一个单词,有可能某个长度的单词集合的个数大于1,他又希望这些单词按字母表顺序罗列,甚至他在考GRE,发自内心地想先看到比较长的单词,所以对于长度的分组要从大到小排列。

  要是用以往传统的C#实现,这个需求变更并不太难,大不了先把所有长度找到,再按字母表顺序输出相应的单词。等我们好不容易改好,交给客户,他又不满意了。他说,老罗教我们必须按字母表顺序背单词,但是同一字母开头的单词还是需要先背长的,你给我重新输出个词表吧。这个时候,用传统C#实现的你,肯定会觉得要疯了,因为这次需求变更造成的代码增量应该不小,甚至原来的业务逻辑相当于重新来过,这客户咋这样?没办法,他是上帝,那就再改咯。

  不过如果是用LINQ实现,问题的解决方案就变得简单得多得多,只需稍稍改写那句SQL(结构不变,仅调换几个变量的位置和逻辑即可),显示的逻辑基本上都可以不变,代码复用度和效率都大大提高。贴上需求变更后的代码,仅供大家参考,可能还有更好的方案。 
1using System; 2using System.Collections.Generic; 3using System.Text; 4using System.Linq; 5 6namespace HelloWorld 7{ 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 string[] words = { "Hello", "Wonderful", "Linq", "Beautiful", "World" }; 13 14 var groups = 15 from word in words 16 orderby word.Length descending 17 group word by word.Substring(0,1) into lengthGroups 18 orderby lengthGroups.Key ascending 19 select new { Cap = lengthGroups.Key, Words = lengthGroups }; 20 21 foreach (var group in groups) 22 { 23 24 foreach (var word in group.Words) 25 Console.WriteLine(" " + word); 26 } 27 28 Console.ReadLine(); 29 } 30 } 31}
  虽然这只是一个简单的入门例子,我们已经能感觉到LINQ的强大了,因为LINQ有着类似SQL语句强大的查询功能,再结合简单易控的.NET代码,就像一股积蓄已久的力量喷薄而出,看来MS还是蛮啥的。我相信,用好LINQ,基于.NET的敏捷开发会越来越更快的。
0
相关文章