【问题标题】:SortedList<TKey,TValue> and duplicated keysSortedList<TKey,TValue> 和重复的键
【发布时间】:2023-03-20 20:20:01
【问题描述】:

我正在使用SortedList<TKey, TValue> 集合。我发现自己经常这样做:

if (!sortedList.ContainsKey(key))
{
    sortedList.Add(key, value);
}

只是为了避免“重复键”异常。我不喜欢这样,代码可读性受到惩罚。显然,我不需要重复的键。

是否有任何选项或不同的集合类型有助于跳过此检查?

【问题讨论】:

  • 您可以创建一个扩展方法并将逻辑包装在其中。并调用扩展方法。

标签: c# .net visual-studio generics collections


【解决方案1】:

如果您想在密钥已经存在的情况下保留旧值(这是您当前代码所做的),那么首先检查是唯一的选择。然而,为了简化事情,我们可以创建一个包装检查的扩展方法。

这是一个返回 bool 的示例,指示是否添加了新值:

public static class Extensions
{
    public static bool AddIfMissing<TKey, TValue>(
        this SortedList<TKey, TValue> list, TKey key, TValue value)
    {
        if (list.ContainsKey(key)) return false;
        list.Add(key, value);
        return true;
    }
}

现在当我们要添加一个值时,我们不必每次都编写检查键的代码,我们只需编写:

sortedList.AddIfMissing(key, value);

【讨论】:

    【解决方案2】:

    够了

    sortedList[key] = value;
    

    如果密钥存在,它将被替换,如果不存在,将被创建。检查here

    【讨论】:

    • 如果 op 想要保留旧的键,如果键已经存在,值对怎么办?
    • 这不是 OP 要求的
    • @Jasmeet 指出此代码不会产生与原始代码相同的行为(问题中的代码如果存在则保留原始值),但您在此答案中很好地描述了更改.
    • @RufusL 对。考虑到这一点,您的解决方案会更好、更充分
    • 仅当 OP 关心保留现有值时。如果没有,你的答案是最好的。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多