这是这个问题的延续: Best way to represent sets of 3 values
我想将物质的温度存储为时间和位置的函数。因此温度随位置和时间而变化。关于位置,我已将整个材料表面划分为i * j个小区域,因此我可以分别为每个区域分配温度。例如,人们应该能够在时间= 3秒读取区域[3,5]的温度。 我的目标是,拥有一个由时间,我和j组成的集合。所以我可以在区域[i = 4,j = 7]中以时间= 3.5秒访问温度。 3D阵列没有帮助,因为我需要能够将时间用作如下所示的键:
temperature[3.5][4,7]
这里3.5是时间,4是i,7是j。 我该怎么办?我应该如何访问温度数据?
答案 0 :(得分:2)
如果要实现完全相同的接口,则应使用索引器属性。让我们从按位置返回温度的对象开始。我称之为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
。
答案 1 :(得分:0)
我认为最好使用Dictionary<float,Dictionary<int,Dictionary<int,float>>>
它将使您以第一个浮点数(时间)建立索引,并且将返回在该给定时间内记录有温度的所有区域的字典。
然后,您可以再次使用int i进行索引以获取具有该索引的所有区域,并再次使用int j进行索引,然后您最终将获得该时间以及该区域i,j的所有温度