Как изменить содержимое IDictionary с помощью LINQ (C # 3.0) - PullRequest
5 голосов
/ 05 июня 2009

Как мне изменить содержимое IDictionary с помощью C # 3.0 (расширения Linq, Linq)?

var enumerable = new int [] { 1, 2};
var dictionary = enumerable.ToDictionary(a=>a,a=>0);
//some code
//now I want to change all values to 1 without recreating the dictionary
//how it is done?

Ответы [ 3 ]

4 голосов
/ 05 июня 2009

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

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);

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

4 голосов
/ 05 июня 2009

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

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

foreach(int key in dictionary.Keys) {
    dictionary[key] = 1;
}
2 голосов
/ 05 июня 2009
foreach (var item in dictionary.Keys)
    dictionary[item] = 1;

Интересно, почему вам может понадобиться такая вещь?

...