2014-11-22 50 views
0

我有一个Dictionary<K,V>与一个已知的,不变的一组密钥。 我想重置字典,但保留键的值,只更改值为null重置一个.NET字典保存键

我可以先在字典上调用Clear(),然后重新添加一对与null作为一个值,应该有更好的方法。

+0

更好的性能或更好的可读性? – kennyzx 2014-11-22 12:26:15

+0

两者都很棒,但如果有选择,我会提高可读性。 – mookid 2014-11-22 12:30:21

+0

如果您提前知道字典的大小,可以通过将已知大小传递给构造函数来获得性能提升。这将防止调整操作的需要。如果要将值设置为空,则必须访问每个值并分别设置它们。 – Grax 2014-11-22 12:31:08

回答

4

您可以使用键和设置所有值为null

例如

var d = new Dictionary<int, string>(); 
d.Keys.ToList().ForEach(x => d[x] = null); 

这里是您可以使用扩展方法列表中,选择哪套房,您的情况更好,并测试其性能

public static class DictionaryExtensions 
{ 
    public static Dictionary<K, V> ResetValues<K, V>(this Dictionary<K, V> dic) 
    { 
     dic.Keys.ToList().ForEach(x => dic[x] = default(V)); 
     return dic; 
    } 

    public static Dictionary<K,V> ResetValuesWithNewDictionary<K, V>(this Dictionary<K, V> dic) 
    { 
     return dic.ToDictionary(x => x.Key, x => default(V), dic.Comparer); 
    } 

} 

,并使用它像

var d = new Dictionary<int, string>(); 
d.ResetValues().Select(..../*method chaining is supported*/); 

d = d.ResetValuesWithNewDictionary().Select(..../*method chaining is supported*/); 
+0

“WithNewDictionary”版本应该可能会将原始字典的Comparer属性传递给相应的ToDictionary重载,以便保留比较语义(例如区分大小写)。 – Joe 2014-11-22 13:03:10

+0

好点!固定@Joe – dotctor 2014-11-22 13:10:07