2013-12-08 23 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,它有一個返回當前元素DictionaryEntry型(包括鍵和值)的屬性Entry,所以這是你所使用的類型:

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

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

     Console.ReadLine(); 
    } 
+0

我接受了Moho的回答,因爲這正是我想要做的。但是SLaks也是對的。當我在這種特殊情況下使用Parallel.Foreach時,它似乎比普通的foreach慢100倍(00:00:00.0411613 vs 00:00:00.0000359) – harrygg

+0

這是一個令人困惑的答案,我想。 'IDictionaryEnumerator'具有'Entry',但這不是'Cast'使用的;相反,它使用'object''返回'Current'屬性,然後投射它的結果。 – svick

+0

文檔中的Entry屬性是一種確定元素類型的方法,在本例中爲DictionaryEntry。我簡單地走過了我的邏輯,釘住了元素的類型。 – Moho