最近在改造一个功能时为了减少循环的层数,于是想着将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

最新文章

  1. Math.random()
  2. [LeetCode] Ternary Expression Parser 三元表达式解析器
  3. Recall, Precision and F-score
  4. GO语言学习
  5. apache无法正常启动,80端口被占用的解决方法
  6. python第三方模块精选
  7. mongodb3.03开启认证
  8. Git 经常使用的命令
  9. ARM-LINUX学习笔记-1
  10. Badboy安装与使用
  11. __block __weak
  12. ORACLE 博客文章目录(2015
  13. linux 启动管理
  14. 开启gtid导入报错
  15. textarea文本域宽度和高度width及height自动适应实现代码
  16. Django Rest Framework之用户频率/访问次数限制
  17. [20171101]修改oracle口令安全问题.txt
  18. day27 多继承 super 详细用法
  19. 51nod1647 小Z的trie
  20. vm 克隆一台新机器启动网卡报错:device eth0 does not seem to be present, delaying initialization

热门文章

  1. Spring启动过程源码分析基本概念
  2. ThreadLocalRandom类原理分析
  3. 【数据结构与算法Python版学习笔记】图——最短路径问题、最小生成树
  4. AIApe问答机器人Scrum Meeting 4.23
  5. OO第四次博客作业--第四单元总结及课程总结
  6. 2021.9.14考试总结[NOIP模拟53]
  7. populating-next-right-pointers-in-each-node-ii leetcode C++
  8. Oracle ORA 12541 报错解决过程
  9. Java第三天【变量、常量、数据类型】
  10. Linux 守护进程原理及实例(Redis、Nginx)