如何使用LINQ(C#3.0)更改IDictionary的内容

如何使用LINQ(C#3.0)更改IDictionary的内容,c#,.net,linq,c#-3.0,idictionary,C#,.net,Linq,C# 3.0,Idictionary,如何使用C#3.0(Linq,Linq扩展)修改IDictionary的内容 LINQ是一种查询方言——它不是直接的变异语言 要更改现有词典的值,foreach可能是您的朋友: foreach(int key in dictionary.Keys) { dictionary[key] = 1; } 我想知道为什么你可能需要做这样的事情。这远不如其他方法清楚,但它应该可以很好地工作: dictionary.Keys.ToList().ForEach(i => dictionary[

如何使用C#3.0(Linq,Linq扩展)修改IDictionary的内容


LINQ是一种查询方言——它不是直接的变异语言

要更改现有词典的值,
foreach
可能是您的朋友:

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

我想知道为什么你可能需要做这样的事情。

这远不如其他方法清楚,但它应该可以很好地工作:

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

但是,在这种情况下,这将不起作用,因为无法为其分配值。

这是一种过于简单化的方法。如果它也是一种变异语言,那不是很好吗?这会导致在枚举期间集合发生更改的运行时错误,并且foreach循环无法继续。因此,基本上,我永远不会在现实中使用第一段代码。扩展方法可能很好,但由于无法分配值,字典不允许太多。不够清晰和效率较低(创建键的克隆列表,并进行2次迭代,而不是1次)。。。胜利者!
dictionary.Keys.ToList().ForEach(i => dictionary[i] = 0);
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);