【问题标题】:Reset a .NET dictionary keeping the keys重置保留密钥的 .NET 字典
【发布时间】:2014-11-22 12:17:37
【问题描述】:

我有一个Dictionary<K,V>,其中包含一组已知的、不变的键。 我想重置字典,但保留键的值,只将值更改为null

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

【问题讨论】:

  • 更好的性能还是更好的可读性?
  • 两者都很好,但如果有选择,我会考虑可读性。
  • 如果您提前知道字典的大小,则可以通过将已知大小传递给构造函数来提高性能。这将防止需要调整大小操作。如果要将值设置为 null,则必须访问每个值并单独设置它们。
  • 好吧,如果反对者能解释他们的投票,我们将不胜感激。
  • @HansPassant 当然。我只对对进行了迭代,并且无法编辑值部分,因为它在 foreach 循环中是只读的。谢谢!

标签: .net c#-3.0 containers


【解决方案1】:

您可以使用键并将所有值设置为空

例如

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

【讨论】:

  • “WithNewDictionary”版本可能应该将原始字典的 Comparer 属性传递给适当的 ToDictionary 重载,以保留比较语义(例如区分大小写)。
猜你喜欢
  • 2013-01-25
  • 2020-09-08
  • 2014-02-01
  • 2022-01-22
  • 1970-01-01
  • 2016-03-14
  • 2014-09-04
  • 2016-02-17
  • 2019-05-25
相关资源
最近更新 更多