我有一个字典定义如下:Dictionary<string, List<int>>我想过滤,以便它只会在其中List<Int>有超过1个值的条目.
下面的代码正确构建我的字典(感谢Andrew Whitaker)
Dictionary<string, List<int>> 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());
Run Code Online (Sandbox Code Playgroud)
但现在我需要对其进行过滤,以便只有包含多个项目的列表才会包含在最终字典中.
您是否介意解释额外的过滤器,因为我想了解我做错了什么.
我添加.Where(m => m.Value.Count > 1)了现有的查询,认为这可以做到这一点,但它给出了"隐式转换"错误.
最早可以应用过滤器的方法是在分组之后和创建字典之前:
.GroupBy(o => o.Value, o => o.Index)
.Where(g => g.Count() > 1)
.ToDictionary(grp => grp.Key, grp => grp.ToList());
Run Code Online (Sandbox Code Playgroud)
这不需要任何解释; 它最有效的是它避免了首先在字典中添加你不想要的项目.
如果您想保留单项列表但仅在某些时候过滤它们,则需要在字典上过滤
dict.Where(p => p.Value.Count > 1)
Run Code Online (Sandbox Code Playgroud)
你最初的尝试
.ToDictionary(grp => grp.Key, grp => grp.ToList())
.Where(m => m.Value.Count > 1);
Run Code Online (Sandbox Code Playgroud)
没有用,因为即使这是一个非常合理的事情,所产生的结果的类型也是Where如此IEnumerable<KeyValuePair<string, List<int>>>.但是,您尝试将此值分配给类型为具体字典的变量,这是一个可枚举的键值对列表的特例,编译器必须阻止您这样做才能保证类型安全.
如果你改变了fieldNameList上面的类型,那么这行将编译,但你以后将无法使用该IDictionary<K, V>接口.
| 归档时间: |
|
| 查看次数: |
657 次 |
| 最近记录: |