在论坛上经常会看到别人问,linq怎么实现递归,如何求笛卡尔积等问题。。都可以用linq快速方便的解决。。下面我就来个总的归纳

1.)递归

我们经常会遇到一个情况,就是想获取当前节点下的所有子节点。比如我们查询的时候,条件选的广东,那么广州、深圳、东莞都在该范围内,当然还包括广州下的街道等。我们首先想到的是递归来解决。但如何结合linq呢?下面来看看吧

  1.     static List<City> list = new List<City>()
  2. {
  3. new City{id=1,name="广东",parentid=0},
  4. new City{id=2,name="广州",parentid=1},
  5. new City{id=3,name="深圳",parentid=1},
  6. new City{id=4,name="东莞",parentid=1},
  7. new City{id=5,name="越秀区",parentid=2},
  8. new City{id=6,name="白云区",parentid=2},
  9. };
  10.  
  11. static void Main(string[] args)
  12. {
  13. var result = GetChilds(list.First());
  14. }
  15.  
  16. public static IEnumerable<City> GetChilds(City city)
  17. {
  18. var temp = list.Where(x => x.parentid == city.id);
  19. return temp.Concat(temp.SelectMany(x => GetChilds(x)));
  20. }

很简单吧?这里我们可以就concat前后分2部份来看,temp为当前city的子节点temp.selectmany那里是找出该子节点下的子节点,这样就好理解了吧

2.)笛卡尔积

想到笛卡尔积,首先想到selectmany来处理

  1.      static void Main(string[] args)
  2. {
  3. string[] s1 = { "A", "B", "C" };
  4. string[] s2 = { "D", "E" };
  5. var result = s1.SelectMany(x => s2.Select(y => x + y));
  6. foreach (var item in result)
  7. {
  8. Console.WriteLine(item);
  9. }
  10. Console.ReadKey();
  11. }

结果如我们所想。但是如果是3个或4个或更多的数组呢?或许你想到循环,递归等。但这里我要给大家介绍一样东西,叫累加器-Aggregate。

  1. static void Main(string[] args)
  2. {
  3. List<string[]> list = new List<string[]>();
  4. string[] s1 = { "A", "B", "C" };
  5. string[] s2 = { "D", "E" };
  6. string[] s3 = { "F", "G" };
  7. list.Add(s1);
  8. list.Add(s2);
  9. list.Add(s3);
  10.  
  11. var result = list.Aggregate((thisCurrent, nextCurrent) => thisCurrent.SelectMany(x => nextCurrent.Select(y => x + y)).ToArray());
  12. foreach (var item in result)
  13. {
  14. Console.WriteLine(item);
  15. }
  16. Console.ReadKey();
  17. }

运行结果

其实就是尾递归。

  1. (thisCurrent, nextCurrent) => thisCurrent.SelectMany(x => nextCurrent.Select(y => x + y)).ToArray()
  1. thisCurrent.SelectMany(x => nextCurrent.Select(y => x + y)).ToArray()会作为参数传到下次的thisCurrent

3.)分组查询小介绍

linq的分组非常强大,用起来也非常爽。比如有一群人,我们想按他们的年龄进行分组,每10岁分一组,我们会这么做

  1. static void Main(string[] args)
  2. {
  3. List<int> list = new List<int>()
  4. {
  5. 6,7,8,9,12,15,18,23,25,33,31,39,40
  6. };
  7. var result = list.GroupBy(x => x / 10);
  8. foreach (var item in result)
  9. {
  10. Console.WriteLine(string.Join(",", item));
  11. }
  12. Console.ReadLine();
  13. }

这里我就不截图了。很简单粗暴。

但如果我们想将1~18岁的归位一组(儿童组),18~28(青年组),29~40为(成人组)那我们该怎么办呢?还要加上个性别,分成女青年组 男青年组等,40岁以上的不分男女,统一归位老人组。这时大家怎么办呢?LINQ照样简单粗暴的解决问题

  1.   public class Person
  2. {
  3. public string name { get; set; }
  4. public int age { get; set; }
  5. public string sex { get; set; }
  6. }
  7.  
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. List<Person> list = new List<Person>()
  13. {
  14. new Person(){name="小A",age=5,sex="男"},
  15. new Person(){name="小B",age=5,sex="女"},
  16. new Person(){name="小C",age=7,sex="男"},
  17. new Person(){name="小D",age=12,sex="男"},
  18. new Person(){name="小E",age=20,sex="女"},
  19. new Person(){name="小F",age=21,sex="男"},
  20. new Person(){name="小G",age=25,sex="男"},
  21. new Person(){name="小H",age=39,sex="男"},
  22. new Person(){name="小I",age=55,sex="男"},
  23. new Person(){name="小J",age=54,sex="女"},
  24. };
  25. var result = list.GroupBy(x =>
  26. {
  27. if (x.age <= 18)
  28. return x.sex + "儿童组";
  29. if (x.age > 18 && x.age <= 28)
  30. return x.sex + "青年组";
  31. if (x.age > 28 && x.age <= 40)
  32. return x.sex + "成人组";
  33. return "老人组";
  34. });
  35.  
  36. foreach (var item in result)
  37. {
  38. string name = string.Join(",", item.Select(x => x.name));
  39. Console.WriteLine(string.Format("{0}:{1}", item.Key, name));
  40. }
  41. Console.ReadKey();
  42. }

运行结果

不知道大家学到东西没。。LINQ很灵活,关键就看你怎么玩了。。用得好的话一句话就能解决很多复杂的东西

 

2.Linq实用性技巧篇的更多相关文章

  1. FastReport 使用技巧篇

    使用技巧篇 1.FastReport中如果访问报表中的对象?       可以使用FindObject方法.      TfrxMemoView(frxReport1.FindObject('memo ...

  2. 2天驾驭DIV+CSS (技巧篇)(转)

     这是去年看到的一片文章,感觉在我的学习中,有不少的影响.于是把它分享给想很快了解css的兄弟们.本文是技巧篇. 基础篇[知识一] “DIV+CSS” 的叫法是不准确的[知识二] “DIV+CSS” ...

  3. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

  4. Visual Studio调试之断点技巧篇补遗

    原文链接地址:http://blog.csdn.net/Donjuan/article/details/4649372 讲完Visual Studio调试之断点技巧篇以后,翻翻以前看得一些资料和自己写 ...

  5. Blend_技巧篇_淡入淡出

    原文:Blend_技巧篇_淡入淡出 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010265681/article/details/766517 ...

  6. Blend_技巧篇_导入PSD文件制作ToggleButton (Z)

    原文:Blend_技巧篇_导入PSD文件制作ToggleButton (Z) 系统: Win7sp1 32位 IDE: Microsoft VisualStudio 2013 Ultimate Ble ...

  7. Gatling脚本编写技巧篇(二)

    脚本示例: import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.durati ...

  8. 《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)

    1.简介 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本.接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用 ...

  9. 《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath上卷(详细教程)

    1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath.xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. ...

随机推荐

  1. Python Requests模块讲解4

    高级用法 会话对象 请求与响应对象 Prepared Requests SSL证书验证 响应体内容工作流 保持活动状态(持久连接) 流式上传 块编码请求 POST Multiple Multipart ...

  2. POJ 1906

    #include <iostream> #include <string> #define MAXN 150 using namespace std; int _m[MAXN] ...

  3. 解决Cygwin中文乱码

    如下图所示,在执行ping或者cmd.exe命令时,Cygwin出现中文乱码: 解决方案: 在Cygwin终端上右键-->Options…-->Text-->修改Locale 为 z ...

  4. vector、string实现大数加法乘法

    理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...

  5. 从一次面试经历谈PHP的普通传值与引用传值以及unset

    关于这个概念一般都会在PHP的第一堂课说变量的时候给介绍,并且我以前还给其他PHPer介绍这个概念.但是作为一个工作一段时间的PHPer的我,竟然在面试的时候一下子拿不定主意最后还答错了,很觉得丢脸( ...

  6. Orcle数据库查询练习复习:四

    一.题目 1.找出张三的最高分和最低分以及对应的课程名 select * from course c,mark m where c.cid=m.cid and sid =(select sid fro ...

  7. android MD5

    public static String MD5(String str) { MessageDigest md5 = null; try { md5 = MessageDigest.getInstan ...

  8. 244. Shortest Word Distance II

    题目: This is a follow up of Shortest Word Distance. The only difference is now you are given the list ...

  9. HDU5090——Game with Pearls(匈牙利算法|贪心)(2014上海邀请赛重现)

    Game with Pearls Problem DescriptionTom and Jerry are playing a game with tubes and pearls. The rule ...

  10. Asterisk服务安装配置和启动

    Asterisk服务安装配置和启动 2014年11月4日 11:36 注意: 更新源的重要性 源的地址: http://fffo.blog.163.com/blog/static/2119130682 ...