【问题标题】:How to use Parallel.ForEach to display the values of IDictionary?如何使用 Parallel.ForEach 显示 IDictionary 的值?
【发布时间】:2013-12-08 20:13:36
【问题描述】:

我是 C# 爱好者,我正在使用 Parallel.ForEach 方法。我正在尝试使用以下代码在给定系统上显示环境变量:

IDictionary vars = Environment.GetEnvironmentVariables();

Parallel.ForEach(vars, (envVar) =>
{
   Console.WriteLine("{0} = {1}", envVar.Key, envVar.Value);
});

但是我最终得到了这个错误:

错误 3 方法的类型参数 'System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner, System.Action)' 不能从用法推断。尝试指定类型参数 明确的。

我很确定我错过了一个演员,但无论我尝试了什么,我都无法让它发挥作用。 你能帮帮我吗?

【问题讨论】:

  • 这只适用于通用集合。此外,这里没有理由使用并行性。

标签: c# parallel.foreach


【解决方案1】:

IDictionary.GetEnumerator()返回一个IDictionaryEnumerator,它有一个属性Entry,它返回类型为DictionaryEntry的当前元素(键和值),所以这就是你使用的类型:

    static void Main()
    {
        var envVars = Environment.GetEnvironmentVariables();

        Parallel.ForEach( envVars.Cast<DictionaryEntry>(), ev =>
            {
                Console.WriteLine( "{0}: {1}", ev.Key, ev.Value );
            } );

        Console.ReadLine();
    }

【讨论】:

  • 我接受了 Moho 的回答,因为这正是我想做的。然而,SLaks 也是对的。当我在这种特殊情况下使用 Parallel.Foreach 时,它似乎比常规 foreach 慢 100 倍(00:00:00.0411613 vs 00:00:00.0000359)
  • 我认为这有点令人困惑。 IDictionaryEnumerator 确实有 Entry,但这不是 Cast 使用的;相反,它使用object-returning Current 属性,然后转换其结果。
  • 文档中的Entry 属性是一种确定元素类型的方法,在本例中为DictionaryEntry。我只是通过我的逻辑来确定元素的类型。
猜你喜欢
  • 2014-12-29
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 2018-04-15
相关资源
最近更新 更多