我有一个词典字典的内存高速缓存,我希望它能使使用该词典的任何人都无法修改该词典的内容。我想返回一个IReadOnlyDictionary。当前返回:
Dictionary<string, Dictionary<string, string>>
但我希望它返回:
IReadOnlyDictionary<string, IReadOnlyDictionary<string, string>>
如何使用LINQ快速干净地将可变版本转换为不可变对象?
ETA:有人添加了“此问题已得到回答”,指向指向转换列表字典的帖子。我不想转换列表字典。我想转换字典词典。如果所有将其标记为重复的人并以引用的帖子为基准发布答案,我将承认。但这是我们正在处理的全新数据结构。
答案 0 :(得分:1)
有一个ReadOnlyDictionary<TKey,TValue>
类在其构造函数中接受IDictionary<TKey,TValue>
字典。您可以返回一个包裹Dictionary<string, Dictionary<string, string>>
的包裹:
public IReadOnlyDictionary<string, IReadOnlyDictionary<string, string>> TheDict =>
new ReadOnlyDictionary<string, IReadOnlyDictionary<string, string>>(_theDictionary);
Dictionary<TKey,TValue>
也实现了IReadOnlyDictionary<TKey,TValue>
,因此您也可以直接直接返回原始字典,除非您担心任何使用者都可以将其转换回可变Dictionary<TKey,TValue>
。
答案 1 :(得分:1)
Dictionary<string, Dictionary<string, string>> dictionary;
var readonlyDictionary = new ReadOnlyDictionary<string, ReadOnlyDictionary<string, string>>(dictionary.Select(pair => new { Key = pair.Key, Value = new ReadOnlyDictionary<string, string>(pair.Value) }).ToDictionary(x => x.Key, x => x.Value));
如果您使用的是.Net Core,则可以使用ImmutableDictionary
dictionary.ToImmutableDictionary(pair => pair.Key, pair => pair.Value.ToImmutableDictionary());