我希望有一个数组属性返回同一索引处的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);
}
答案 0 :(得分:3)
不可能使计算属性成为双向,因为计算属性始终是只读的。此外,当您公开返回数组的属性时,您无法控制对方法返回的数组执行的修改:数组本质上是可变的,无法“监视”其元素的更改。
您可以通过提供方法来设置HiLimit
来解决此问题,如下所示:
void SetHiLimit(int index, ushort newLimit) {
// Change `Range` as needed
}
注意:您可以重新考虑使用数组的计算属性,因为每次访问它时都会重新计算。例如,如果您有HiLimit
长度为100的数组,并且您运行一次访问每个元素一次的循环,您的代码将重新计算该数组100次,创建100个相同的丢弃副本,其总体渐近性能为为O(n 2 )。