c#Array属性基于其他数组

时间:2017-02-06 15:08:39

标签: c# arrays linq properties

我希望有一个数组属性返回同一索引处的2个其他数组的计算(这已在另一个问题Array property returns calculation of 2 other arrays中使用zip回答)。但现在我必须设置计算的值。

public ushort[] LowLimit{ get; set; }

public ushort[] Range{ get; set; }

public ushort[] HiLimit => LowLimit.Zip(Range, (l,r) => (ushort)(l + r)).ToArray();

即。如果我设置HiLimit [0],Range将设置为(value - LowLimit),这怎么可能? getter和setter都是必需的。

编辑(2017-02-09): 我已将@dasblinkenlight答案标记为正确,因为它不可能。我需要这个的原因是因为我正在与发送下限和范围的设备进行通信,但软件允许用户读取和编辑下限和上限。上限和下限与显示器上的控件绑定,因此我使用了属性,并在与设备通信时设置了两种方法来设置和获取范围。

public ushort[] LowLimit{ get; set; } = new ushort[8];

public ushort[] HighLimit{ get; set; } = new ushort[8];

public ushort getRange(int index) {
    ushort range = 0;

    if(index < 8)
        range = (ushort)(HighLimit[index] - LowLimit[index]);
    return range;
}

public void setRange(int index, ushort value) {
    if (index < 8)
        HighLimit[index] = (ushort)(LowLimit[index] + value);
}

1 个答案:

答案 0 :(得分:3)

不可能使计算属性成为双向,因为计算属性始终是只读的。此外,当您公开返回数组的属性时,您无法控制对方法返回的数组执行的修改:数组本质上是可变的,无法“监视”其元素的更改。

您可以通过提供方法来设置HiLimit来解决此问题,如下所示:

void SetHiLimit(int index, ushort newLimit) {
    // Change `Range` as needed
}

注意:您可以重新考虑使用数组的计算属性,因为每次访问它时都会重新计算。例如,如果您有HiLimit长度为100的数组,并且您运行一次访问每个元素一次的循环,您的代码将重新计算该数组100次,创建100个相同的丢弃副本,其总体渐近性能为为O(n 2 )。