Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于其他数组的c#数组属性_C#_Arrays_Linq_Properties - Fatal编程技术网

基于其他数组的c#数组属性

基于其他数组的c#数组属性,c#,arrays,linq,properties,C#,Arrays,Linq,Properties,我希望有一个数组属性返回同一索引下其他两个数组的计算结果(这已经在另一个问题中使用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

我希望有一个数组属性返回同一索引下其他两个数组的计算结果(这已经在另一个问题中使用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],范围将设置为(value-LowLimit),这怎么可能呢?getter和setter都是必需的

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

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);
}
public-ushort[]LowLimit{get;set;}=new-ushort[8];
public-ushort[]上限{get;set;}=new-ushort[8];
公共ushort getRange(int索引){
ushort范围=0;
如果(指数<8)
范围=(ushort)(上限[索引]-下限[索引]);
返回范围;
}
public void setRange(int索引,ushort值){
如果(指数<8)
上限[索引]=(ushort)(下限[索引]+值);
}

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

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

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

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

FYI,每次访问expression bodied属性时,它都将执行计算/执行代码。因此,每次你得到一个新的阵列-它不是缓存或存储在一个fieldLowLimit中,它的范围来自与软件通信的设备。LowLimit和HiLimit是用户可以在软件中编辑的参数。我想你的意思是对计算数组进行更改,如果我没有使用数组,我可以只向getter和setter添加代码?我希望使用属性的原因是为了绑定,在这种情况下函数将不起作用。@jsun5192如果返回数组类型的属性,则在执行
obj.HiLimit[1]=123
时将不会有setter调用。您将看到对getter而不是setter的调用,因为赋值是在数组上执行的,而不是在属性上执行的。