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

Thi*_*rry 3 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());
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jon*_*Jon 5

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

.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>接口.

  • @DavidPilkington:请看一下[这里]的评论(http://stackoverflow.com/a/18913573/50079),我的观点是,对分组结果开始枚举*要求*首先完全实现该组(否则,机会可怕的表现),所以在不变的时间内获得计数所需的信息已经存在.因此,对于BCL而言,如果没有像数组和列表一样利用它,那将是"愚蠢的",事实上确实如此. (4认同)