记一次使用 SelectMany 的经历
2024-09-08 11:57:33
最近在改造一个功能时为了减少循环的层数,于是想着将List列表映射为一个能直接使用颗粒大小的List列表,这样一层循环就可以解决问题。
public class ConflictWordItemForDisplay
{
/// <summary>
/// 基准字段
/// </summary>
public string BasisField { get; set; }
/// <summary>
/// 关键字
/// </summary>
public string Keyword { get; set; }
/// <summary>
/// 冲突词汇(支持多个词汇,词汇之间用,分隔)
/// </summary>
public string ConflictWord { get; set; }
/// <summary>
/// 判别字段
/// </summary>
public List<string> JudgingFields { get; set; }
}
定义的数据类类似上面,在实际使用去进行判断时可能需要用到三层循环,类似下面的伪代码
foreach (var item in conflictWordItemForDisplayList)
{
if (基准字段的内容.ToUpper().contains(item.Keyword.ToUpper()))
{
foreach (var judgingField in item.JudgingFields)
{
foreach (var word in item.ConflictWord.Split(','))
{
if (judgingField对应的判别字段的内容.ToUpper().contains(word.ToUpper()))
{
//冲突,进行对应的处理(提示用户让用户修改之类)
}
}
}
}
}
在判别字段类型较少且固定时可以用判断逻辑来减少一层循环。
如果用 SelectMany将粒度降到最小应该怎么写呢。微软对SelectMany的描述是将序列的每个元素投影到 IEnumerable<T> 并将结果序列合并为一个序列。包括以下重载
将判别字段降低到最小粒度:
var allConflictWordItemForDisplay = conflictWordItemForDisplayList.SelectMany(p => p.JudgingFields, (s, r) => new ConflictWordItemForDisplay() { BasisField=s.BasisField,Keyword=s.Keyword,ConflictWord=s.ConflictWord,JudgingFields=new List<string> { r} });
将冲突词汇降低到单独一个词汇的粒度:
allConflictWordItemForDisplay = allConflictWordItemForDisplay.SelectMany(p => p.ConflictWord.Split(','), (s, r) => new ConflictWordItemForDisplay() { BasisField = s.BasisField, Keyword = s.Keyword, ConflictWord = r, JudgingFields = s.JudgingFields });
这只是SelectMany适用于我这个问题的使用方式,SelectMany还有其他重载函数,使用到时可以详细了解一下。
下面是微软官方文档,里面也有用例方便理解。
https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.enumerable.selectmany?view=netframework-4.6.1
最新文章
- Math.random()
- [LeetCode] Ternary Expression Parser 三元表达式解析器
- Recall, Precision and F-score
- GO语言学习
- apache无法正常启动,80端口被占用的解决方法
- python第三方模块精选
- mongodb3.03开启认证
- Git 经常使用的命令
- ARM-LINUX学习笔记-1
- Badboy安装与使用
- __block __weak
- ORACLE 博客文章目录(2015
- linux 启动管理
- 开启gtid导入报错
- textarea文本域宽度和高度width及height自动适应实现代码
- Django Rest Framework之用户频率/访问次数限制
- [20171101]修改oracle口令安全问题.txt
- day27 多继承 super 详细用法
- 51nod1647 小Z的trie
- vm 克隆一台新机器启动网卡报错:device eth0 does not seem to be present, delaying initialization
热门文章
- Spring启动过程源码分析基本概念
- ThreadLocalRandom类原理分析
- 【数据结构与算法Python版学习笔记】图——最短路径问题、最小生成树
- AIApe问答机器人Scrum Meeting 4.23
- OO第四次博客作业--第四单元总结及课程总结
- 2021.9.14考试总结[NOIP模拟53]
- populating-next-right-pointers-in-each-node-ii leetcode C++
- Oracle ORA 12541 报错解决过程
- Java第三天【变量、常量、数据类型】
- Linux 守护进程原理及实例(Redis、Nginx)