只读列表<Dictionary<>>
Readonly List<Dictionary<>>
如果我们有字段 List<Dictionary<>>
,如何将其公开为只读 属性?
例如:
public class Test
{
private List<Dictionary<string, object>> _list;
}
我可以这样曝光
public ReadOnlyCollection<Dictionary<string, object>> List
{
get { return _list.AsReadOnly(); }
}
但仍然可以更改目录:
var test = new Test();
test.List[0]["a"] = 3; // possible
test.List[0].Add("e", 33); // possible
尝试将其设置为只读
public ReadOnlyCollection<ReadOnlyDictionary<string, object>> List
{
get
{
return _list.Select(item =>
new ReadOnlyDictionary<string, object>(item)).ToList().AsReadOnly();
}
}
我认为这种方法的问题很明显:它是新词典的新列表。
我想要的是类似于 List<>.AsReadOnly() 的东西,让 属性 充当 _list
的包装器。
如果您无法创建新的 Dictionary
对象列表,我建议您直接从 class 公开您需要的项目:
public IReadOnlyDictionary<string, object> this[int i]
{
get { return this._list[i]; }
}
//OR
public IReadOnlyDictionary<string, object> GetListItem(int i)
{
return _list[i];
}
public int ListCount
{
get { return this._list.Count; }
}
然后像这样使用它:
var test = new Test();
var dictionary = test[0];
//OR
dictionary = test.GetListItem(0);
int count = test.ListCount;
我创建了一个 ReadOnlyDictionary
的列表并用转换后的词典填充它,完成后我将整个列表转换为 AsReadOnly
.
代码:
public ReadOnlyCollection<ReadOnlyDictionary<string, object>> AsReadOnlyListAndElements
{
get
{
var list = _list.Select(elem => new ReadOnlyDictionary<string, object>(elem));
return list.ToList().AsReadOnly();
}
}
旧解:
您可以使用要公开的方法创建类似于此的包装器:
public class ReadOnlyDict<K, V>
{
private Dictionary<K, V> dictionary;
public ReadOnlyDict(Dictionary<K, V> dict)
{
dictionary = dict;
}
public V this[K key]
{
get
{
return dictionary[key];
}
}
// Add more methods per your request
}
还有一个扩展方法:
namespace System.Collections.Generic
{
public static class DictionaryExt
{
public static ReadOnlyDict<K, V> ToReadOnlyDictionary<K, V>(this Dictionary<K, V> dict)
{
return new ReadOnlyDict<K, V>(dict);
}
}
}
你的代码看起来像这样:
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("2", "2");
dict.Add("3", "3");
var roDict = dict.ToReadOnlyDictionary();
var a = roDict["2"];
无法避免创建新列表,因为 Dictionary
项必须转换为 IReadOnlyDicionary
(通过使用 Cast
或 Select
)。那么问题来了
Why it should be a list?
ReadOnlyList
仅用于通过使用索引或在 foreach
中访问项目。那么,为什么不简单地提供呢?
@Bas 解决方案与索引器和简单 属性 与 yield return
产生最终解决方案:
public class Test
{
private List<Dictionary<string, object>> _list = new List<Dictionary<string, object>>();
public IEnumerable<IReadOnlyDictionary<string, object>> Items
{
get
{
foreach (var item in _list)
yield return item;
}
}
public IReadOnlyDictionary<string, object> this[int i]
{
get { return _list[i]; }
}
public int Count
{
get { return _list.Count; }
}
}
字典(和列表)可以像这样从外部以只读方式访问:
var test = new Test();
Console.WriteLine(test[0]["a"]); // direct access
foreach (var item in test.Items) // enumeration
foreach(var dic in item)
Console.WriteLine(dic);
如果我们有字段 List<Dictionary<>>
,如何将其公开为只读 属性?
例如:
public class Test
{
private List<Dictionary<string, object>> _list;
}
我可以这样曝光
public ReadOnlyCollection<Dictionary<string, object>> List
{
get { return _list.AsReadOnly(); }
}
但仍然可以更改目录:
var test = new Test();
test.List[0]["a"] = 3; // possible
test.List[0].Add("e", 33); // possible
尝试将其设置为只读
public ReadOnlyCollection<ReadOnlyDictionary<string, object>> List
{
get
{
return _list.Select(item =>
new ReadOnlyDictionary<string, object>(item)).ToList().AsReadOnly();
}
}
我认为这种方法的问题很明显:它是新词典的新列表。
我想要的是类似于 List<>.AsReadOnly() 的东西,让 属性 充当 _list
的包装器。
如果您无法创建新的 Dictionary
对象列表,我建议您直接从 class 公开您需要的项目:
public IReadOnlyDictionary<string, object> this[int i]
{
get { return this._list[i]; }
}
//OR
public IReadOnlyDictionary<string, object> GetListItem(int i)
{
return _list[i];
}
public int ListCount
{
get { return this._list.Count; }
}
然后像这样使用它:
var test = new Test();
var dictionary = test[0];
//OR
dictionary = test.GetListItem(0);
int count = test.ListCount;
我创建了一个 ReadOnlyDictionary
的列表并用转换后的词典填充它,完成后我将整个列表转换为 AsReadOnly
.
代码:
public ReadOnlyCollection<ReadOnlyDictionary<string, object>> AsReadOnlyListAndElements
{
get
{
var list = _list.Select(elem => new ReadOnlyDictionary<string, object>(elem));
return list.ToList().AsReadOnly();
}
}
旧解:
您可以使用要公开的方法创建类似于此的包装器:
public class ReadOnlyDict<K, V>
{
private Dictionary<K, V> dictionary;
public ReadOnlyDict(Dictionary<K, V> dict)
{
dictionary = dict;
}
public V this[K key]
{
get
{
return dictionary[key];
}
}
// Add more methods per your request
}
还有一个扩展方法:
namespace System.Collections.Generic
{
public static class DictionaryExt
{
public static ReadOnlyDict<K, V> ToReadOnlyDictionary<K, V>(this Dictionary<K, V> dict)
{
return new ReadOnlyDict<K, V>(dict);
}
}
}
你的代码看起来像这样:
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("2", "2");
dict.Add("3", "3");
var roDict = dict.ToReadOnlyDictionary();
var a = roDict["2"];
无法避免创建新列表,因为 Dictionary
项必须转换为 IReadOnlyDicionary
(通过使用 Cast
或 Select
)。那么问题来了
Why it should be a list?
ReadOnlyList
仅用于通过使用索引或在 foreach
中访问项目。那么,为什么不简单地提供呢?
@Bas 解决方案与索引器和简单 属性 与 yield return
产生最终解决方案:
public class Test
{
private List<Dictionary<string, object>> _list = new List<Dictionary<string, object>>();
public IEnumerable<IReadOnlyDictionary<string, object>> Items
{
get
{
foreach (var item in _list)
yield return item;
}
}
public IReadOnlyDictionary<string, object> this[int i]
{
get { return _list[i]; }
}
public int Count
{
get { return _list.Count; }
}
}
字典(和列表)可以像这样从外部以只读方式访问:
var test = new Test();
Console.WriteLine(test[0]["a"]); // direct access
foreach (var item in test.Items) // enumeration
foreach(var dic in item)
Console.WriteLine(dic);