使字典只能在C#中读取

bpe*_*kes 11 c# collections covariance

我有一个Dictionary<string, List<string>>并希望将该成员公开为只读.我看到我可以将它作为一个返回IReadOnlyDictionary<string, List<string>>,但我无法弄清楚如何将它作为一个返回IReadOnlyDictionary<string, IReadOnlyList<string>>.

有没有办法做到这一点?在c ++中,我只是使用const,但C#没有.

请注意,IReadOnlyDictionary在这种情况下简单地使用a 没有帮助,因为我希望只读取值.看来唯一的方法是构建另一个IReadOnlyDictionary,并向它们添加IReadOnlyList.

另一个我不会兴奋的选择是创建实现接口IReadOnlyDictionary>的包装器,并让它保存原始实例的副本,但这似乎有点过分.

Mat*_*zer 17

这将是铸造整个辞典参考那样容易IReadOnlyDictionary<string, IReadOnlyList<string>>,因为Dictionary<TKey, TValue>工具IReadOnlyDictionary<TKey, TValue>.

顺便说一句,你不能这样做,因为你想要的List<string>价值为IReadOnlyList<string>.

所以你需要这样的东西:

var readOnlyDict = (IReadOnlyDictionary<string, IReadOnlyList<string>>)dict.ToDictionary(pair => pair.Key, pair => pair.Value.AsReadOnly());
Run Code Online (Sandbox Code Playgroud)

不变的词典

这只是一个建议,但如果您正在寻找不可变的词典,请将System.Collections.ImmutableNuGet包添加到您的解决方案中,您将能够使用它们:

// ImmutableDictionary<string, ImmutableList<string>>
var immutableDict = dict.ToImmutableDictionary(pair => pair.Key, pair => pair.Value.ToImmutableList());
Run Code Online (Sandbox Code Playgroud)

在此处了解有关Immutable Collections的更多信息.

  • Upvote建议使用imutables. (2认同)

Joh*_*tos 5

鉴于您实际上是在寻找只读的事实,因此您Dictionary<string, List<string>>基本上在寻找Lookup

Dictionary对象具有ToLookup()扩展名。

  • 是的,@ MladenB。,但是OP要求该值是`List &lt;string&gt;`,因此查找可以正常工作。 (2认同)