Как да използвам Parallel.ForEach за показване на стойностите на IDictionary?

Аз съм ентусиаст на 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‹TSource>(System.Collections.Concurrent.OrderablePartitioner‹TSource>, System.Action‹TSource,System.Threading.Tasks.ParallelLoopState,long>)“ не може да се заключи от употребата. Опитайте изрично да посочите аргументите на типа.

Почти съм сигурен, че ми липсва отливка, но каквото и да опитвах, не успях. можеш ли да ми помогнеш


person harrygg    schedule 08.12.2013    source източник
comment
Това работи само с общи колекции. Също така, няма причина да се използва паралелизъм тук.   -  person SLaks    schedule 09.12.2013


Отговори (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();
    }
person Moho    schedule 08.12.2013
comment
Приех отговора на Мохо, тъй като точно това исках да направя. SLaks обаче също е прав. Когато използвам Parallel.Foreach в този конкретен случай, изглежда, че е ~100 пъти по-бавен от обикновения foreach (00:00:00.0411613 срещу 00:00:00.0000359) - person harrygg; 09.12.2013
comment
Мисля, че това е малко объркващ отговор. IDictionaryEnumerator има Entry, но това не е това, което Cast използва; вместо това той използва свойството object-връщане Current и след това прехвърля своя резултат. - person svick; 09.12.2013
comment
Свойството Entry в документацията е начин за определяне на типа на елементите, в този случай DictionaryEntry. Просто минах през моята логика, за да заковавам типа на елемента. - person Moho; 09.12.2013