这是这个问题的继续:Best way to represent sets of 3 values
我想把物质的温度存储为时间和位置的函数。所以温度会随位置和时间而变化。关于位置,我已经将材料的整个表面划分为i*j个小区域,因此我可以分别为每个区域分配温度。例如,一个人应该能够在time=3秒读取区域3,5的温度。我的目标是,拥有一个由时间、i和j组成的集合,这样我就可以访问i=4,j=7区域中time = 3.5秒的温度。3D数组没有帮助,因为我需要能够使用时间作为键,如下所示:
temperature[3.5][4,7] 这里3.5是时间,4是i,7是j,我该怎么做呢?我应该如何访问温度数据?
发布于 2017-03-29 20:01:46
如果你想实现完全相同的接口,那么你应该使用索引器属性。让我们从按位置返回温度的对象开始。我就叫它Surface吧。您可以使用名称区域或任何您认为更合适的名称。这个对象应该保存表面上每个位置的温度值,或者它应该从存储中获取这些值:
public class Surface
{
// you can have time property here as well
public double this[int i, int j]
{
get { return GetTemperatureValueFromDataSource(i,j); }
}
}现在,您需要从另一个类返回给定时间内的这些对象:
public class Temperature
{
public Surface this[double time]
{
get { return GetSurfaceObjectForGivenTime(time); }
}
}那么界面将会是你想要的:
var temperature = new Temperature();
double value = temperature[3.5][4,7];请注意,您应该考虑如何处理在给定时间内没有表面温度数据的情况,或者如果您试图获取表面点的温度超出可用范围的情况。例如,如果在给定时间内没有数据,则可以返回null,但应使用空条件运算符,以避免NullReferenceException:
double? value = temperature[3.5]?[4,7];或者你可以返回一些NullObject,它会有一些虚拟的行为。参考曲面点不在可用范围内也是如此。您可以对温度值使用可以为空的返回类型。或者你可以抛出ArgumentOutOfRangeException。
发布于 2019-10-11 16:40:27
我认为最好是使用Dictionary<float,Dictionary<int,Dictionary<int,float>>>
它将允许您使用第一个浮点(时间)进行索引,并将返回所有区域的字典,其中记录了给定时间的温度。
然后你可以用int i再次索引,得到所有带有该索引的区域,然后用int j再次索引,最后你可以得到那个时间和那个区域i,j的所有温度。
https://stackoverflow.com/questions/43092649
复制相似问题