微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 ReadOnlyCollection<T> 的 ReadOnlyDictionary<TKey, TValue>

如何解决带有 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 举报,一经查实,本站将立刻删除。