我有一个定义如下的字典: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());
但现在我需要对其进行过滤,以便只有包含多个项目的列表才会包含在最终词典中。
你介意解释一下额外的过滤器吗,因为我想了解我做错了什么。
我添加了 .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>
稍后界面。
关于c# - 使用linq返回具有多个存储在字典中的值的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20285443/