gpt4 book ai didi

c# - IDictionary 和 IReadOnlyDictionary 的扩展方法

转载 作者:太空狗 更新时间:2023-10-29 20:58:51 25 4
gpt4 key购买 nike

我的问题类似于the previous one ,但该问题的答案不适用于此问题。

好吧,我想为这两个 IDictionary 写一个扩展方法和 IReadOnlyDictionary接口(interface):

public static TValue? GetNullable<TKey, TValue>(this IReadOnlyDictionary<TKey, TValue> dictionary, TKey key)
where TValue : struct
{
return dictionary.ContainsKey(key)
? (TValue?)dictionary[key]
: null;
}

public static TValue? GetNullable<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
where TValue : struct
{
return dictionary.ContainsKey(key)
? (TValue?)dictionary[key]
: null;
}

但是当我将它与实现两个接口(interface)的类一起使用时(例如 Dictionary<Tkey, TValue> ),我得到了“模糊调用”。我不想输入 var value = myDic.GetNullable<IReadOnlyDictionary<MyKeyType, MyValueType>>(key) , 我希望它只是 var value = myDic.GetNullable(key) .

这可能吗?

最佳答案

您只需要一种扩展方法。重新定义如下:

public static TValue? GetNullableKey<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> dictionary, TKey, key) where TValue : struct
{
// Your code here.
// Per @nmclean: to reap performance benefits of dictionary lookup, try to cast
// dictionary to the expected dictionary type, e.g. IDictionary<K, V> or
// IReadOnlyDictionary<K, V>. Thanks for that nmclean!
}

IDictionary<TKey, TValue>IReadOnlyDictionary<TKey, TValue> 都继承自 IEnumerable<KeyValuePair<TKey, TValue>>

HTH.

更新:回答您的评论问题

如果您不需要调用只出现在一个接口(interface)或另一个接口(interface)上的方法(即您只调用存在于 IEnumerable<KeyValuePair<TKey, TValue>> 上的方法),那么不,您不需要该代码。

如果您确实需要在 IDictionary<TKey, TValue>IReadOnlyDictionary<TKey, TValue> 接口(interface)上调用公共(public)基接口(interface)上不存在的方法,那么是的,您需要查看您的对象是其中之一,以了解哪些方法是有效调用。

更新:您可能(很可能)不应该使用此解决方案

因此,从技术上讲,此解决方案在回答 OP 的问题时是正确的,如前所述。然而,这确实不是一个好主意,正如其他人在下面评论的那样,我承认这些评论是正确的。

一方面,字典/ map 的全部意义在于 O(1)(恒定时间)查找。通过使用上面的解决方案,您现在已经将 O(1) 操作变成了 O(n)(线性时间)操作。如果您的字典中有 1,000,000 个项目,则查找键值所需的时间最多为 100 万倍(如果您真的不走运的话)。这可能会对性能产生重大影响。

小字典呢?好吧,那么问题就变成了,你真的需要一本字典吗?列个 list 会更好吗?或者也许是一个更好的问题:您从哪里开始注意到使用 O(n) 而非 O(1) 查找的性能影响以及您希望多久执行一次此类查找?

最后,OP 的对象同时实现 IReadOnlyDictionary<TKey, TValue>IDictionary<TKey, TValue> 的情况很奇怪,因为 IDictionary<TKey, TValue> 的行为是 IReadOnlyDictionary<TKey, TValue> 行为的超集。标准的 Dictionary<TKey, TValue> 类已经实现了这两个接口(interface)。因此,如果 OP 的(我假设是专门的)类型继承自 Dictionary<TKey, TValue> 而不是,那么当需要只读功能时,该类型可以简单地转换为 IReadOnlyDictionary<TKey, TValue> ,可能完全避免这整个问题。即使问题不是不可避免的(例如,在某处,对其中一个接口(interface)进行了强制转换),实现两个扩展方法仍然会更好,每个接口(interface)一个。

我想在我完成这个话题之前还需要一个顺序。将 Dictionary<TKey, TValue> 转换为 IReadOnlyDictionary<TKey, TValue> 只能确保接收转换值的任何内容本身都无法改 rebase 础集合。但是,这并不意味着对从中创建强制转换引用的字典实例的其他引用不会改 rebase 础集合。这是 IReadOnly* 集合接口(interface)背后的提示之一——这些接口(interface)引用的集合可能不是真正的“只读”(或者,通常暗示的,不可变的)集合,它们只是防止集合被特定引用改变(尽管有具体 ReadOnly* 类的实际实例)。这是创建集合类的 System.Collections.Immutable 命名空间的原因之一(除其他外)。此命名空间中的集合代表真正不可变的集合。这些集合的“突变”导致返回包含突变状态的全新集合,而原始集合不受影响。

关于c# - IDictionary 和 IReadOnlyDictionary 的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18641693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com