Linq下有一个非常实用的SelectMany方法,很多人却不会用
在平时开发中经常会看到有些朋友或者同事在写代码时会充斥着各种for,foreach,这种程式代码太多的话阅读性特别差,而且还显得特别累赘,其实在FCL中有很多帮助我们提高阅读感的方法,而现实中很多人不会用或者说不知道,这篇我就跟大家聊一聊。
一:SelectMany
这个方法绝对是提高开发速度的一大利器,有太多的业务场景需要使用这个函数,举一个我实际应用场景,商家按照年份和客户类型预先设置一些标签,然后让系统跑一下它的各自标签到底有多少人?
1. 定义Model
为了方便演示,这里做了一下简化代码,只有一个字典,key表示年份,value:就是该年份的多组标签。
public class EstimateModel
{
public int ShopID { get; set; }
//key: 年份
public Dictionary<string, List<TagCrowdFilterModel>> YearCrowdFilterDict { get; set; }
}
public class TagCrowdFilterModel
{
/// <summary>
/// 筛选条件
/// </summary>
public string CrowdFiter { get; set; }
/// <summary>
/// 获取人数
/// </summary>
public int TotalCustomerCount { get; set; }
}
为了更加清晰,我决定再填充一下数据
public static void Main(string[] args)
{
var estimateModel = new EstimateModel()
{
ShopID = 1,
YearCrowdFilterDict = new Dictionary<string, List<TagCrowdFilterModel>>()
{
{
"17年",new List<TagCrowdFilterModel>()
{
new TagCrowdFilterModel(){ CrowdFiter="between 10 and 20" },
new TagCrowdFilterModel(){ CrowdFiter=" a<10 || a>30" },
}
},
{
"18年",new List<TagCrowdFilterModel>()
{
new TagCrowdFilterModel(){ CrowdFiter="between 100 and 200" },
new TagCrowdFilterModel(){ CrowdFiter=" a<100 || a>300" },
}
},
{
"19年",new List<TagCrowdFilterModel>()
{
new TagCrowdFilterModel(){ CrowdFiter="between 1000 and 2000" },
new TagCrowdFilterModel(){ CrowdFiter=" a<1000 || a>3000" },
}
}
}
};
}
public static int GetCustomerID(string crowdfilter)
{
return BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0);
}
2. 实现需求
需求也很简单,就是依次获取 TagCrowdFilterModel 中的 CrowdFiter 字段再调用GetCustomerID方法把人数赋值给TotalCustomerCount即可,这么简单的需求,如果让你来搞定,你该怎么实现这个逻辑? 没错,很多人可能就是两个foreach搞定。
foreach (var year in estimateModel.YearCrowdFilterDict.Keys)
{
var yearCrowdFitlerList = estimateModel.YearCrowdFilterDict[year];
foreach (var crowdFitler in yearCrowdFitlerList)
{
crowdFitler.TotalCustomerCount = GetCustomerID(crowdFitler.CrowdFiter);
}
}
看似代码也很清爽,但现实哪有这么好的事情,真实情况是年份上可能还要套上一个客户类型,客户类型之上再套一个商品,商品之上再套一个商家,这样很深的层级你就需要多达3个foreach,4个foreach甚至5个foreach才能搞定,再放张图给大家看看,是不是看着头大...
Linq下有一个非常实用的SelectMany方法,很多人却不会用的更多相关文章
- Parallel.For 你可能忽视的一个非常实用的重载方法
说起Parallel.For大家都不会陌生,很简单,不就是一个提供并行功能的for循环吗? 或许大家平时使用到的差不多就是其中最简单的那个重载方法,而真实情况 下Parallel.For里面有14个重 ...
- [转] linux 下查看一个进程运行路径的方法
http://blog.csdn.net/brioxu/article/details/5104736 在linux下查看进程大家都会想到用 ps -ef|grep XXX ps -aux | hea ...
- liunx下查看日志最实用命令和方法
1.业务系统访问量不是很大的时候,使用这个,有bug的地方操作下,直接看最后操作的日志,就是你刚才操作的地方,好好查bug吧 tail -fn100 catalina.log 查询日志尾部 ...
- 使IE6下PNG背景透明的七种方法任你选
原文地址:http://blog.csdn.net/mosliang/article/details/6760028 相信如何解决png在ie6下透明的问题困扰了很多人.为了追求更好的页面效果,很多人 ...
- 重写类的Equals以及重写Linq下的Distinct方法
当自定义一个类的时候,如果需要用到对比的功能,可以自己重写Equals方法,最整洁的方法是重写GetHashCode()方法. 但是,这个方法只适用于对象自身的对比(如if(a==b))以及字典下的C ...
- [C语言]一个很实用的服务端和客户端进行TCP通信的实例
本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...
- 学习LINQ,发现一个好的工具。LINQPad!!
今日学习LINQ,发现一个好的工具.LINQPad!! 此工具的好处在于,不需要在程序内执行,直接只用工具测试.然后代码通过即可,速度快,简洁方便. 可以生成其LINQ查询对应的lambda和SQL语 ...
- 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目
自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...
- 基于gulp编写的一个简单实用的前端开发环境
自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...
随机推荐
- oracle使用expdp定时备份数据库
目录 oracle使用expdp备份数据库 备份shell脚本 创建定时任务 oracle使用expdp备份数据库 备份shell脚本 #!/bin/sh #获取当前时间 BACKUPTIME=$(d ...
- Android位置服务开发
1. 使用LocationManager获取地理位置信息 代码如下: private TextView positiontext; private String provider; private L ...
- 初始Django—Hello world
1. 准备环境 > python -V Python > pip -V pip from c:\python3\lib\site-packages\pip (python 3.7) > ...
- 分享CCNTFS小工具,在 macOS 中完全读写、修改、访问Windows NTFS硬盘的文件,无须额外的驱动(原生驱动)更稳定,简单设置即可高速传输外接NTFS硬盘文件
CCNTFS [ 下载 ] 在 macOS 中完全读写.修改.访问Windows NTFS硬盘的文件,无须额外的驱动(原生驱动)更稳定,安装后进行简单设置即可高速传输外接NTFS硬盘文件,可全程离线使 ...
- 关于Quartz .NET(V3.0.7)的简要说明
目录 0. 任务调度 1. Quartz .NET 1.1 基本概念 1.2 主要接口和对象 2. 使用示例 2.0 准备工作 2.1 每间隔一定时间间隔执行一次任务 2.3 某天的固定时间点执行任务 ...
- laravel的中间件创建思路
网上有很多解析laravel中间件的实现原理,但是不知道有没有读者在读的时候不明白,作者是怎么想到要用array_reduce函数的? 本文从自己的角度出发,模拟了如果我是作者,我是怎么实现这个中间件 ...
- MySQL----SQL操作
1.什么是SQL? Structured Query Language:结构化查询语言 其实就是定义了操作所有关系型数据库的规则.每一种数据库操作的方式存在不一样的地方,称为“方言”. 2.SQL通用 ...
- 从sslyze看TLS证书的点点滴滴
纵观眼下,https已经深入大街小巷,成为网络生活中不可或缺的一部分了.提到了https,我们又不得不想到TLS(SSL),而提到了TLS,我们又不得不提到一个让人捉摸不透的东西:TLS证书. 关于证 ...
- Log4Net读取XML配置文件及在代码中完成添加Logger操作
解决问题: 将log4net配置文件与app.config配置文件分开 手动读取log4net配置文件 手动创建logger 可将日志输出功能封装在类库中,应用程序引用时无需添加assembly引用及 ...
- 说说自己为什么用Mac不用Win系统?
原本Mac和Win系统各有优劣,但偏偏最近有人误导身边的朋友说"学编程肯定是Windows系统呀,Mac不行的",又不给出有说服力的理由,于是我心有愤懑,正好趁机总结一下自己对于两 ...