2013-12-08 2 views
2

Я энтузиаст C#, и я играю с Parallel.ForEach методом. Я пытаюсь отобразить переменные среды на данной системе, используя следующий код:Как использовать Parallel.ForEach для отображения значений IDictionary?

IDictionary vars = Environment.GetEnvironmentVariables(); 

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

Однако я в конечном итоге с этой ошибкой:

Error 3 The type arguments for method 'System.Threading.Tasks.Parallel.ForEach<TSource>(System.Collections.Concurrent.OrderablePartitioner<TSource>, System.Action<TSource,System.Threading.Tasks.ParallelLoopState,long>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

Я уверен, что я пропускаю бросок, но все, Я пытался, я не мог заставить его работать. Можете ли вы мне помочь?

+7

Это работает только с родовыми коллекциями. Кроме того, здесь нет оснований использовать параллелизм. – SLaks

ответ

5

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(); 
    } 
+0

Я принял ответ Мохо, так как это было именно то, что я хотел сделать. Однако SLaks также прав. Когда я использую Parallel.Foreach в этом конкретном случае, он, кажется, ~ 100 раз медленнее, чем обычный foreach (00: 00: 00.0411613 vs 00: 00: 00.0000359) – harrygg

+0

Это несколько путающий ответ, я думаю. 'IDictionaryEnumerator' имеет' Entry', но это не то, что использует 'Cast'; вместо этого он использует свойство 'object'-return' Current', а затем выводит его результат. – svick

+0

Свойство 'Entry' в документации - это способ определить тип элементов, в данном случае' DictionaryEntry'. Я просто прошел через мою логику, прибивая тип элемента. – Moho

Смежные вопросы