将IEnumerable<string>转换为Dictionary

4
在将bool distinct添加到Splitter方法并检查distinct is true后,代码出现了问题。查询现在不是字典,而是IEnumerable<string>,但应该是Dictionary<string, int>。如何解决?
这是错误信息:

无法隐式转换类型'System.Collections.Generic.IEnumerable'为'System.Collections.Generic.Dictionary'。存在显式转换(是否缺少强制转换?)

代码如下:
private Dictionary<string, int> Splitter(string[] file, bool distinct)
{
    var query = file
        .SelectMany(i => File.ReadLines(i)
        .SelectMany(line => line.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries))
        .AsParallel()
        .Select(word => word.ToLower())
        .Where(word => !StopWords.Contains(word))
        .Where(word => !StopWordsPl.Contains(word))
        .Where(word => !PopulatNetworkWords.Contains(word))
        .Where(word => !word.All(char.IsDigit)));
        if (distinct)
        {
        query = query.Distinct();
        }

       query.GroupBy(word => word)
            .ToDictionary(g => g.Key, g => g.Count());
       return query;
}

2
GroupBy和ToDictionary不会修改底层对象,您需要正确执行在查询之前的几行代码query = query.Distinct(); - Andrey
1个回答

15

ToDictionary 返回您所需要的内容。只需返回它,而不是返回 query

return query.GroupBy(word => word)
            .ToDictionary(g => g.Key, g => g.Count());

@YuvalItzchakov 我知道! - Daniel A. White
值得指出的是,distinct 代码现在只有使计数值始终为 1 的效果。我认为这不太可能是有意的,并且看不到 distinct 的任何用途。 - Tim S.
1
@Ken'ichiMatsuyama,这里有一种更有效的方法:.ToDictionary(g => g.Key, g => distinct ? 1 : g.Count());。实际上,调用Distinct对于计算机和人类代码阅读者来说都是不必要的工作。 - Tim S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接