如何解决带有 ReadOnlyCollection<T> 的 ReadOnlyDictionary<TKey, TValue>
我有一堆类需要将属性作为 ReadOnlyCollection<T>
返回,当它们只是 List<T>
时效果很好,但是,由于列表位于 { 中,所以事情变得非常草率{1}}。
================================================ =
例如,这是我作为 ReadOnlyCollection 返回的典型列表:
Dictionary<TKey,TValue>
================================================ =
然而,这是我需要为 ReadOnlyDictionary
private readonly List<string> _encryptionKeys;
public ReadOnlyCollection<string> EncryptionKeys => _encryptionKeys.AsReadOnly();
... 使用临时变量:
private readonly ReadOnlyDictionary<string,ReadOnlyCollection<string>> _attributes;
public ReadOnlyDictionary<string,ReadOnlyCollection<string>> Attributes => _attributes;
Dictionary<string,List<string>> attributes = new Dictionary<string,List<string>>();
================================================ =
大家有什么建议吗?
解决方法
把它做成扩展方法,那你就不用一直想了:
public static ReadOnlyDictionary<TKey,ReadOnlyCollection<TValue>> AsReadOnly<TKey,TValue>(this Dictionary<TKey,List<TValue>> source)
{
return new ReadOnlyDictionary<TKey,ReadOnlyCollection<TValue>>(
new Dictionary<TKey,ReadOnlyCollection<TValue>>(
source.Select(kvp =>
new KeyValuePair<TKey,ReadOnlyCollection<TValue>>(kvp.Key,kvp.Value.AsReadOnly())
));
}
虽然,采用 IEnumerable<KeyValuePair>
的构造函数仅在 .NET 5 中可用。因此在早期版本中,我们将不得不 foreach
。当我们预先调整字典的大小时,此选项也可能更高效
public static ReadOnlyDictionary<TKey,List<TValue>> source)
{
var dict = new Dictionary<TKey,ReadOnlyCollection<TValue>>(source.Count);
foreach (var kvp in source)
dict[kvp.Key] = kvp.Value.AsReadOnly();
return new ReadOnlyDictionary<TKey,ReadOnlyCollection<TValue>>(dict);
}
就像使用其他 AsReadOnly
扩展一样使用它。
Linq 可以为您完成繁重的工作。
Dictionary<string,List<string>> input = new Dictionary<string,List<string>>();
ReadOnlyDictionary<string,ReadOnlyCollection<string>> output = new ReadOnlyDictionary<string,ReadOnlyCollection<string>>(dict.ToDictionary(kv => kv.Key,kv => kv.Value.AsReadOnly()));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。