我有以下密封课程。我正在尝试将列表作为ReadOnlyCollection
返回。尝试了几件事,但我没有掌握这一点。那么如何将列表返回或转换为只读集合呢?
public sealed class UserValues
{
private readonly List<UserValue> _Values = new List<UserValue>();
public ReadOnlyCollection<UserValues> Values
{
get
{
return _Values;
}
}
}
答案 0 :(得分:4)
尝试:
return new ReadOnlyCollection<UserValue>(_Values);
编辑:
鉴于你对Jon所说的话,你的代码没有意义。您的get
引用的是List<UserValue>
类型,但您希望将其转换为ReadOnlyCollection<UserValues>
类型,而这种类型无法完成 - 这是2种不同类型的2个集合。
我们需要更多信息来帮助您回答这个问题。您是否希望UserValues
类返回UserValues
类型的集合或UserValue
类型的集合?您的代码隐含UserValue
,但您的后续评论状态为UserValues
。你确定你的主管没有写错字吗?
如果没有,你需要一些像这样的内部收藏:
private readonly List<UserValues> _MoreValues = new List<UserValues>();
然后返回,在语法中我(或其他已经回答的人 - 所有给出的答案都有效将List转换为ReadOnlyCollection)已经显示出来了。
请注意,我的代码编译目标.Net 3.5,假设类型兼容(意味着ReadOnlyCollection<UserValue>
包裹List<UserValue>
,或两者都是UserValues
)。
答案 1 :(得分:3)
您收到编译时错误,因为List<UserValue>
不 a ReadOnlyCollection<UserValue>
,也不能隐式转换为ReadOnlyCollection<UserValue>
。 (顺便说一下,我假设您的意思是ReadOnlyCollection<UserValues>
而不是public sealed class UserValues
{
private readonly List<UserValue> values = new List<UserValue>();
private readonly ReadOnlyCollection<UserValue> valuesView;
public UserValues()
{
valuesView = values.AsReadOnly();
}
public ReadOnlyCollection<UserValues> Values { get { return valuesView; } }
}
?)
使用List<T>.AsReadOnly
可能最简单 - 但您也可以只创建一次:
ReadOnlyCollection<T>
{{1}}实际上只是一个视图 - 因此通过视图可以看到底层集合的更改。
答案 2 :(得分:2)
_Values
是List<UserValue>
,而不是ReadOnlyCollection<UserValue>
(就编译器而言,它们不相关),因此您无法直接返回_Values
。您可以从列表中创建ReadOnlyCollection<T>
并返回,例如:
private List<UserValue> _Values = [whatever];
private ReadOnlyCollection<UserValue> _ValuesWrapper;
public UserValues()
{
_ValuesWrapper = _Values.AsReadOnly();
}
public ReadOnlyCollection<UserValue> Values
{
get { return _ValuesWrapper; }
}
...或者,如果您只是寻找一种只读方式来访问您的集合并且不需要专门的ReadOnlyCollection<UserValue>
对象,您可以更改您的属性以返回只读接口List<T>
实现了,您的应用程序可以使用它。 .NET 4.5为这类事情引入了一些伟大的只读集合接口:
public IReadOnlyList<UserValue> Values
{
get { return _Values; }
}