Linq下有一个非常实用的SelectMany方法,很多人却不会用(linq selectmany)

网友投稿 270 2022-08-21

Linq下有一个非常实用的SelectMany方法,很多人却不会用(linq selectmany)

在平时开发中经常会看到有些朋友或者同事在写代码时会充斥着各种for,foreach,这种程式代码太多的话阅读性特别差,而且还显得特别累赘,其实在FCL中有很多帮助我们提高阅读感的方法,而现实中很多人不会用或者说不知道,这篇我就跟大家聊一聊。

一:SelectMany

这个方法绝对是提高开发速度的一大利器,有太多的业务场景需要使用这个函数,举一个我实际应用场景,商家按照年份和客户类型预先设置一些标签,然后让系统跑一下它的各自标签到底有多少人?

1. 定义Model

为了方便演示,这里做了一下简化代码,只有一个字典,key表示年份,value:就是该年份的多组标签。

public class EstimateModel

{

public int ShopID { get; set; }

//key: 年份

public Dictionary> YearCrowdFilterDict { get; set; }

}

public class TagCrowdFilterModel

{

///

/// 筛选条件

///

public string CrowdFiter { get; set; }

///

/// 获取人数

///

public int TotalCustomerCount { get; set; }

}

为了更加清晰,我决定再填充一下数据

public static void Main(string[] args)

{

var estimateModel = new EstimateModel()

{

ShopID = 1,

YearCrowdFilterDict = new Dictionary>()

{

{

"17年",new List()

{

new TagCrowdFilterModel(){ CrowdFiter="between 10 and 20" },

new TagCrowdFilterModel(){ CrowdFiter=" a<10 || a>30" },

}

},

{

"18年",new List()

{

new TagCrowdFilterModel(){ CrowdFiter="between 100 and 200" },

new TagCrowdFilterModel(){ CrowdFiter=" a<100 || a>300" },

}

},

{

"19年",new List()

{

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才能搞定,再放张图给大家看看,是不是看着头大...

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:C# WebClient download image within url and display the downloaded picture automatically in windows o(曹海涛)
下一篇:C# dotnet 的锁 SemaphoreSlim 和队列(cctv5体育节目表)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~