【问题标题】:Converting IEnumerable<string> to Dictionary将 IEnumerable<string> 转换为 Dictionary
【发布时间】:2015-05-20 13:45:15
【问题描述】:

在将bool distinct 添加到方法Splitter 并检查distinct is true 代码是否损坏后。现在的查询不是字典,而是IEnumerable&lt;string&gt;,但应该是Dictionary&lt;string, int&gt;。怎么可能解决?

这是错误:

无法将类型“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;
}

【问题讨论】:

  • GroupBy 和 ToDictionary 不修改底层对象,您在 query = query.Distinct(); 上方几行正确地做到了这一点;

标签: c# dictionary casting ienumerable deferred-execution


【解决方案1】:

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

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

【讨论】:

  • @YuvalItzchakov 我知道!
  • 值得指出的是,distinct 代码现在只具有使此处的计数值始终为1 的效果。我发现这不太可能是故意的,并且看不到 distinct 的任何用途。
  • @Ken'ichiMatsuyama 这是一种更有效的方法,然后:.ToDictionary(g =&gt; g.Key, g =&gt; distinct ? 1 : g.Count());。实际上调用Distinct对于计算机和人类代码阅读器来说都是不必要的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多