我有一个字典定义如下: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)
了现有的查询,认为这可以做到这一点,但它给出了"隐式转换"错误.
最早可以应用过滤器的方法是在分组之后和创建字典之前:
.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>
接口.