快速将字典词典转换为IReadOnlyDictionary

时间:2019-09-26 14:30:18

标签: c# .net linq dictionary

我有一个词典字典的内存高速缓存,我希望它能使使用该词典的任何人都无法修改该词典的内容。我想返回一个IReadOnlyDictionary。当前返回:

Dictionary<string, Dictionary<string, string>>

但我希望它返回:

IReadOnlyDictionary<string, IReadOnlyDictionary<string, string>>

如何使用LINQ快速干净地将可变版本转换为不可变对象?

ETA:有人添加了“此问题已得到回答”,指向指向转换列表字典的帖子。我不想转换列表字典。我想转换字典词典。如果所有将其标记为重复的人并以引用的帖子为基准发布答案,我将承认。但这是我们正在处理的全新数据结构。

2 个答案:

答案 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());