zoukankan      html  css  js  c++  java
  • 记一次使用 SelectMany 的经历

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

     如果内容对您有帮助,可以在主页-公告栏下面扫码给我打赏,你的鼓励是我前进的动力。

    本文来自博客园,作者:业荒于嬉,转载请注明原文链接:https://www.cnblogs.com/FreeLoopPowter/p/15630032.html

    如内容对您有所帮助,还请不吝推荐一下!

  • 相关阅读:
    在pytorch中使用可视化工具visdom
    3"GAN-GAN实战:GD的实现
    31:GAN-js散度的缺陷以及解决办法:WGAN的提出
    31:GAN-DCGAN(deconvolution GAN逆卷积操作)以及JS散度的缺陷
    31:GAN-纳什均衡
    31:GAN-GAN原理
    30:无监督学习-自编码网络的变种
    30:无监督学习-自编码(Auto-Encoder简称AE)原理
    如何打印网络的参数量
    29:迁移学习(当数据集比较小时,可以使用迁移学习达到一个更好的效果)
  • 原文地址:https://www.cnblogs.com/FreeLoopPowter/p/15630032.html
Copyright © 2011-2022 走看看