c# - 具有后备属性的列表没有获得附加值

标签 c# list

我想到了一种访问列表属性的巧妙方法:

private List<int> _stages;
public List<int> Stages
{
    get
    {
        return (_stages ?? (_stages = new List<int>())).OrderBy(s => s).ToList();
    }
    set
    {
        _stages = value;
    }
}

这样即使 Stages 为 null,如果我使用 Stages.Add(1),它也会先被初始化,然后再添加值。但是它不起作用,我真的无法弄清楚,因为没有太多要调试的东西。 _stages 被初始化,但无论我调用多少次 Stages.Add(1)_stages 仍然是一个空列表。

我错过了什么?

最佳答案

return (_stages ?? (_stages = new List<int>())).OrderBy(s => s).ToList();

这等同于:

var stages = _stages;
if (stages == null)
    stages = _stages = new List<int>();

return stages.OrderBy(s => s).ToList();

因此,当您在列表为 null 时正确初始化列表时,您仍然总是返回 .OrderBy(s => s).ToList()

Enumerable.ToList()调用将总是创建一个新列表。

所以 getter 返回的列表是一个新列表,它没有链接到内部支持的 _stages 列表。因此,当您将一个项目添加到列表中时,您是将其添加到已排序的副本中,而不是原始列表中。

您可以通过始终将排序后的列表分配回支持字段来更改此设置,但这仍然会引入每次访问该属性时始终对字段进行排序的开销。并且访问 getter 通常不应该有副作用,所以我会避免这样做。最好在对象上提供一个清晰的 SortStages 方法来实际对列表进行排序。

此外,您应该考虑使用 List.Sort()就地对列表进行排序,这样您就不会得到新的列表对象。

关于c# - 具有后备属性的列表没有获得附加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39328580/

相关文章:

python - Python 中 3D 数组的最佳数据结构

list - Erlang - 来自两个列表的常见项目

C# - 从一元类型的方法(或类)创建并返回多类型泛型

c# - WCF 地址访问拒绝异常

c# - 一个解决方案中的多个 Web API 2 应用程序,均使用 Ninject

r - 将一个列表映射到另一个列表

python - 我有一个包含 0 和 1 值的数组。如果我将其与 -1 相乘,则会产生空数组。为什么?

c# - 从字符串 C# 中删除点字符

c# - Libgit2sharp 迭代提交从最新到最旧

python - 第一个大于 x 的 Python 列表索引?