Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ReadOnlyDictionary<;TKey,TValue>;使用只读集合<;T>;_C#_.net_.net 5_C# 8.0 - Fatal编程技术网

C# ReadOnlyDictionary<;TKey,TValue>;使用只读集合<;T>;

C# ReadOnlyDictionary<;TKey,TValue>;使用只读集合<;T>;,c#,.net,.net-5,c#-8.0,C#,.net,.net 5,C# 8.0,我有一大堆类需要返回属性作为ReadOnlyCollections,当它们只是Lists时效果很好,但是,当List在字典中时,事情变得非常混乱 ================================================ 例如,这是我作为只读集合返回的典型列表: private readonly List<string> _encryptionKeys; public ReadOnlyCollection<string> Encryp

我有一大堆类需要返回属性作为
ReadOnlyCollection
s,当它们只是
List
s时效果很好,但是,当List在
字典中时,事情变得非常混乱

================================================

例如,这是我作为只读集合返回的典型列表:

    private readonly List<string> _encryptionKeys;
    public ReadOnlyCollection<string> EncryptionKeys => _encryptionKeys.AsReadOnly();
私有只读列表\u加密密钥;
public ReadOnlyCollection EncryptionKeys=>_EncryptionKeys.AsReadOnly();
================================================

然而,这是我需要为一本只读小说做的抽搐:

private readonly ReadOnlyDictionary属性;
public ReadOnlyDictionary属性=>\u属性;
。。。使用临时变量:

        Dictionary<string, List<string>> attributes = new Dictionary<string, List<string>>();
Dictionary attributes=newdictionary();
。。。向其中添加值及其列表,然后构建我的属性:

        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);
Dictionary readonlyistdictionary=newdictionary();
foreach(attributes.Keys中的字符串键)
添加(键,属性[key].AsReadOnly());
_属性=新的ReadOnlyDictionary(readonlyListDictionary);
================================================


有人有什么建议吗?

将其作为一种扩展方法,这样您就不必一直考虑它:

public static ReadOnlyDictionary AsReadOnly(此字典源代码)
{
返回新的ReadOnlyDictionary(
新词典(
source.Select(kvp=>
新的KeyValuePair(kvp.Key、kvp.Value.AsReadOnly())
));
}
尽管如此,采用
IEnumerable
的构造函数仅在.NET 5中可用。因此,在早期版本中,我们必须使用
foreach
。当我们预先调整字典的大小时,此选项的性能可能会更高

public static ReadOnlyDictionary AsReadOnly(此字典源代码)
{
var dict=新字典(source.Count);
foreach(源中的var kvp)
dict[kvp.Key]=kvp.Value.AsReadOnly();
返回新的只读字典(dict);
}

只需像使用另一个
AsReadOnly
扩展一样使用它。

Linq可以为您完成重磅提升

字典输入=新建字典();
ReadOnlyDictionary输出=新的ReadOnlyDictionary(dict.ToDictionary(kv=>kv.Key,kv=>kv.Value.AsReadOnly());

<代码> >我建议避免<代码> RealOnLyDeCys<代码>。由于各种原因,我不会进入。考虑返回<代码> iRealOnt.< /Cord>接口。也请看<代码> Stury.St藏品。不可变的< /代码>(因为不可变性比单纯的代码> iRead……/代码>对消费者提供更大的保证)。。您需要随机访问列表中的值吗?您可以直接从字典中创建一个查找,它实际上是一个只读的枚举字典。太好了!谢谢
        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);