c# - 使用linq返回具有多个存储在字典中的值的列表

标签 c# linq

我有一个定义如下的字典: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/

相关文章:

c# - 从对象列表生成字符串列表

C# Linq Guid 匿名类型问题

c# - 在 Resources 文件夹中有一个子文件夹 Visual Studio C# Windows Form

c# - 创建多维列表

c# - 为什么 MySQL 数据库中的 Code First 没有创建模型 connectionString?

c# - 非标识符属性上的 RavenDB 跨实体查询匹配

c# - 如何在 Linq to Sql .Where() 中写入 "OR"

c# - 使用 Linq to Entities 进行分组和多重排序

c# - 使用 MvcMailer 发送电子邮件表单

java - 在 C# 中使用 .jar java 库 API?