8

我有以下密封类。我正在尝试将列表作为ReadOnlyCollection. 尝试了几件事,但我不明白这一点。那么如何将列表返回或转换为只读集合?

    public sealed class UserValues
    {
        private readonly List<UserValue> _Values = new List<UserValue>();

        public ReadOnlyCollection<UserValues> Values
        {
            get
            {
                return _Values;
            }
        }
    }
4

3 回答 3

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>wrapsList<UserValue>或两者都是UserValues)。

于 2013-05-05T20:22:21.667 回答
4

您收到编译时错误,因为 aList<UserValue>不是a ,也不能隐式转换为ReadOnlyCollection<UserValue>(我假设你的意思是ReadOnlyCollection<UserValue>而不是ReadOnlyCollection<UserValues>顺便说一句?)

它可能是最简单的使用List<T>.AsReadOnly- 但您最好只创建一次:

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; } }
}

实际上只是一个视图 - 因此对基础集合的ReadOnlyCollection<T>更改将通过视图可见。

于 2013-05-05T20:25:06.020 回答
2

_Values是 a List<UserValue>,而不是 a 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; }
}
于 2013-05-05T20:25:39.493 回答