使用linq将包含多个值的返回列表存储在字典中

  发布于 2023-02-13 19:30

我有一个字典定义如下:Dictionary>我想过滤,以便它只会在其中List有超过1个值的条目.

下面的代码正确构建我的字典(感谢Andrew Whitaker)

Dictionary> fieldNameList = 
    Mapping.Select(m => m.FieldName)
           .Select((c, i) => new { Value = c, Index = i })
           .GroupBy(o => o.Value, o => o.Index)
           .ToDictionary(grp => grp.Key, grp => grp.ToList());

但现在我需要对其进行过滤,以便只有包含多个项目的列表才会包含在最终字典中.

您是否介意解释额外的过滤器,因为我想了解我做错了什么.

我添加.Where(m => m.Value.Count > 1)了现有的查询,认为这可以做到这一点,但它给出了"隐式转换"错误.

1 个回答
  • 最早可以应用过滤器的方法是在分组之后和创建字典之前:

    .GroupBy(o => o.Value, o => o.Index)
    .Where(g => g.Count() > 1)
    .ToDictionary(grp => grp.Key, grp => grp.ToList());
    

    这不需要任何解释; 它最有效的是它避免了首先在字典中添加你不想要的项目.

    如果您想保留单项列表但仅在某些时候过滤它们,则需要在字典上过滤

    dict.Where(p => p.Value.Count > 1)
    

    你最初的尝试

    .ToDictionary(grp => grp.Key, grp => grp.ToList())
    .Where(m => m.Value.Count > 1);
    

    没有用,因为即使这是一个非常合理的事情,所产生的结果的类型也是Where如此IEnumerable<KeyValuePair<string, List<int>>>.但是,您尝试将此值分配给类型为具体字典的变量,这是一个可枚举的键值对列表的特例,编译器必须阻止您这样做才能保证类型安全.

    如果你改变了fieldNameList上面的类型,那么这行将编译,但你以后将无法使用该IDictionary<K, V>接口.

    2023-02-13 19:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有