2.Linq实用性技巧篇
在论坛上经常会看到别人问,linq怎么实现递归,如何求笛卡尔积等问题。。都可以用linq快速方便的解决。。下面我就来个总的归纳
1.)递归
我们经常会遇到一个情况,就是想获取当前节点下的所有子节点。比如我们查询的时候,条件选的广东,那么广州、深圳、东莞都在该范围内,当然还包括广州下的街道等。我们首先想到的是递归来解决。但如何结合linq呢?下面来看看吧
static List<City> list = new List<City>()
{
new City{id=1,name="广东",parentid=0},
new City{id=2,name="广州",parentid=1},
new City{id=3,name="深圳",parentid=1},
new City{id=4,name="东莞",parentid=1},
new City{id=5,name="越秀区",parentid=2},
new City{id=6,name="白云区",parentid=2},
}; static void Main(string[] args)
{
var result = GetChilds(list.First());
} public static IEnumerable<City> GetChilds(City city)
{
var temp = list.Where(x => x.parentid == city.id);
return temp.Concat(temp.SelectMany(x => GetChilds(x)));
}
很简单吧?这里我们可以就concat前后分2部份来看,temp为当前city的子节点temp.selectmany那里是找出该子节点下的子节点,这样就好理解了吧
2.)笛卡尔积
想到笛卡尔积,首先想到selectmany来处理
static void Main(string[] args)
{
string[] s1 = { "A", "B", "C" };
string[] s2 = { "D", "E" };
var result = s1.SelectMany(x => s2.Select(y => x + y));
foreach (var item in result)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
结果如我们所想。但是如果是3个或4个或更多的数组呢?或许你想到循环,递归等。但这里我要给大家介绍一样东西,叫累加器-Aggregate。
static void Main(string[] args)
{
List<string[]> list = new List<string[]>();
string[] s1 = { "A", "B", "C" };
string[] s2 = { "D", "E" };
string[] s3 = { "F", "G" };
list.Add(s1);
list.Add(s2);
list.Add(s3); var result = list.Aggregate((thisCurrent, nextCurrent) => thisCurrent.SelectMany(x => nextCurrent.Select(y => x + y)).ToArray());
foreach (var item in result)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
运行结果
其实就是尾递归。
(thisCurrent, nextCurrent) => thisCurrent.SelectMany(x => nextCurrent.Select(y => x + y)).ToArray()
thisCurrent.SelectMany(x => nextCurrent.Select(y => x + y)).ToArray()会作为参数传到下次的thisCurrent中
3.)分组查询小介绍
linq的分组非常强大,用起来也非常爽。比如有一群人,我们想按他们的年龄进行分组,每10岁分一组,我们会这么做
static void Main(string[] args)
{
List<int> list = new List<int>()
{
6,7,8,9,12,15,18,23,25,33,31,39,40
};
var result = list.GroupBy(x => x / 10);
foreach (var item in result)
{
Console.WriteLine(string.Join(",", item));
}
Console.ReadLine();
}
这里我就不截图了。很简单粗暴。
但如果我们想将1~18岁的归位一组(儿童组),18~28(青年组),29~40为(成人组)那我们该怎么办呢?还要加上个性别,分成女青年组 男青年组等,40岁以上的不分男女,统一归位老人组。这时大家怎么办呢?LINQ照样简单粗暴的解决问题
public class Person
{
public string name { get; set; }
public int age { get; set; }
public string sex { get; set; }
} class Program
{
static void Main(string[] args)
{
List<Person> list = new List<Person>()
{
new Person(){name="小A",age=5,sex="男"},
new Person(){name="小B",age=5,sex="女"},
new Person(){name="小C",age=7,sex="男"},
new Person(){name="小D",age=12,sex="男"},
new Person(){name="小E",age=20,sex="女"},
new Person(){name="小F",age=21,sex="男"},
new Person(){name="小G",age=25,sex="男"},
new Person(){name="小H",age=39,sex="男"},
new Person(){name="小I",age=55,sex="男"},
new Person(){name="小J",age=54,sex="女"},
};
var result = list.GroupBy(x =>
{
if (x.age <= 18)
return x.sex + "儿童组";
if (x.age > 18 && x.age <= 28)
return x.sex + "青年组";
if (x.age > 28 && x.age <= 40)
return x.sex + "成人组";
return "老人组";
}); foreach (var item in result)
{
string name = string.Join(",", item.Select(x => x.name));
Console.WriteLine(string.Format("{0}:{1}", item.Key, name));
}
Console.ReadKey();
}
运行结果
不知道大家学到东西没。。LINQ很灵活,关键就看你怎么玩了。。用得好的话一句话就能解决很多复杂的东西
2.Linq实用性技巧篇的更多相关文章
- FastReport 使用技巧篇
使用技巧篇 1.FastReport中如果访问报表中的对象? 可以使用FindObject方法. TfrxMemoView(frxReport1.FindObject('memo ...
- 2天驾驭DIV+CSS (技巧篇)(转)
这是去年看到的一片文章,感觉在我的学习中,有不少的影响.于是把它分享给想很快了解css的兄弟们.本文是技巧篇. 基础篇[知识一] “DIV+CSS” 的叫法是不准确的[知识二] “DIV+CSS” ...
- LINQ to XML LINQ学习第一篇
LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...
- Visual Studio调试之断点技巧篇补遗
原文链接地址:http://blog.csdn.net/Donjuan/article/details/4649372 讲完Visual Studio调试之断点技巧篇以后,翻翻以前看得一些资料和自己写 ...
- Blend_技巧篇_淡入淡出
原文:Blend_技巧篇_淡入淡出 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010265681/article/details/766517 ...
- Blend_技巧篇_导入PSD文件制作ToggleButton (Z)
原文:Blend_技巧篇_导入PSD文件制作ToggleButton (Z) 系统: Win7sp1 32位 IDE: Microsoft VisualStudio 2013 Ultimate Ble ...
- Gatling脚本编写技巧篇(二)
脚本示例: import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.durati ...
- 《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)
1.简介 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本.接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用 ...
- 《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath上卷(详细教程)
1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath.xpath 的定位方法, 非常强大. 使用这种方法几乎可以定位到页面上的任意元素. ...
随机推荐
- POJ 1504 Adding Reversed Numbers (水题,高精度整数加法)
题意:给两个整数,求这两个数的反向数的和的反向数,和的末尾若为0,反向后则舍去即可.即若1200,反向数为21.题目给出的数据的末尾不会出现0,但是他们的和的末尾可能会出现0. #include &l ...
- 在mac上安装hadoop伪分布式
换了macbook pro之后,要重新安装hadoop,但是mac上的jdk跟windows上的不同,导致折腾了挺久的,现在分享出来,希望对大家有用. 一:下载jdk 选择最新版本下载,地址:http ...
- C# 在vs2010中打开vs2012的项目(转)
在vs2010中打开vs2012的项目 今天在自己的电脑上装了vs2010然后要打开之前在vs2012上创建的sln文件 被提示-- 无法打开在新版本上创建的sln--解决方案--文件 其实vs201 ...
- Intellij IDEA 新建一个EJB工程(三)
之前都是用IDEA启动JBoss服务器,并在启动的同时将EJB项目部署上去.在构建 artifacts 时遇到很多问题,明明是EJB项目却不能用EJB导出,真是奇怪~~ 后来用Web Applicat ...
- QTP数据驱动之读取Excel数据
这个代码的原理是把Excel的数据当做数据库里的数据一样处理,可以对Excel用select来检索需要的数据,然后把数据以键值对的形式保存到oDict里,方便在用例层来调用 Class oDataDi ...
- C# MySQL 数据库操作类
using System; using System.Configuration; using System.Collections; using System.Data; using MySql.D ...
- mac 下php运行bug
如下所说bug在window下没有,在mac下存在. mac下的php报如下错误: fopen("data.json") Error: failed to open stream: ...
- java怎样读取数据库表中字段的数据类型?
用DriverManager.getConnection()得到connect, 用connect.getMetaData()得到 DatabaseMetaData, 用 DatabaseMetaDa ...
- POJ 1088 滑雪【记忆化搜索】
题意:给出一个二维矩阵,要求从其中的一点出发,并且当前点的值总是比下一点的值大,求最长路径 记忆化搜索,首先将d数组初始化为0,该点能够到达的路径长度保存在d数组中,同时把因为路径是非负的,所以如果已 ...
- EF DataBase First生成model的验证
如何避免在EF自动生成的model中的DataAnnotation被覆盖掉 相信很多人刚接触EF+MVC的时候,DataBase First模式生成model类中加验证信息的时候,会在重新生成mode ...