2009-06-04 1 views

ответ

4

Это не так ясно, как и другие способы, но он должен работать нормально:

dictionary.Keys.ToList().ForEach(i => dictionary[i] = 0); 

Моя другая альтернатива была бы сделать метод расширения ForEach похожее на это:

public static class MyExtensions 
{ 
    public static void ForEach<T>(this IEnumerable<T> items, Action<T> action) 
    { 
     foreach (var item in items) 
     { 
      action(item); 
     } 
    } 
} 

Затем используйте его так:

dictionary.ForEach(kvp => kvp.Value = 0); 

Это не будет работать в этом случае, поскольку значение не может быть таким, как подписан.

+0

Так что, в принципе, я бы никогда не использовал первый кусок кода в реальности. Метод расширения может быть большим, но поскольку значение не может быть присвоено, словари не допускают многого. –

+1

Не так ясно * и * менее эффективно (создает клонированный список ключей и делает 2 итерации вместо 1) ... победителем! –

4

LINQ - это диалект запросов - он не является языком мутации.

Для изменения значения существующего словаря, foreach, вероятно, ваш друг:

foreach(int key in dictionary.Keys) { 
    dictionary[key] = 1; 
} 
+0

Было бы неплохо, если бы это был также язык мутаций? –

+3

Это то, что это ... –

+1

Это дает ошибку времени выполнения изменения коллекции во время перечисления и что цикл foreach не может продолжаться. – pauldoo

2
foreach (var item in dictionary.Keys) 
    dictionary[item] = 1; 

Интересно, почему вы, возможно, необходимо делать такую ​​вещь, хотя.

+0

Это было упрощение. –