【发布时间】:2021-02-02 01:36:42
【问题描述】:
我有一堆类需要将属性返回为ReadOnlyCollection<T>s,当它们只是List<T>s 时效果很好,但是,与Dictionary<TKey, TValue> 中的列表相比,事情变得非常草率。
================================================ =
例如,这是一个典型的列表,我以 ReadOnlyCollection 的形式返回:
private readonly List<string> _encryptionKeys;
public ReadOnlyCollection<string> EncryptionKeys => _encryptionKeys.AsReadOnly();
================================================ =
但是,这是我需要为 ReadOnlyDictionary
private readonly ReadOnlyDictionary<string, ReadOnlyCollection<string>> _attributes;
public ReadOnlyDictionary<string, ReadOnlyCollection<string>> Attributes => _attributes;
...使用临时变量:
Dictionary<string, List<string>> attributes = new Dictionary<string, List<string>>();
...向其中添加值及其列表,然后构建我的属性:
Dictionary<string, ReadOnlyCollection<string>> readonlyListDictionary = new Dictionary<string, ReadOnlyCollection<string>>();
foreach (string key in attributes.Keys)
readonlyListDictionary.Add(key, attributes[key].AsReadOnly());
_attributes = new ReadOnlyDictionary<string, ReadOnlyCollection<string>>(readonlyListDictionary);
================================================ =
有人有什么建议吗?
【问题讨论】:
-
我建议避免使用
ReadOnlyCollection<T>,原因有很多,我不会讨论。考虑改为返回IReadOnly...接口。另请查看System.Collections.Immutable(因为与简单的IReadOnly...相比,不变性为消费者提供了更大的保证)。 -
您需要随机访问列表中的值吗?您可以改为从字典中创建一个查找,它实际上是一个只读的枚举字典。