用C#中的键表示3D数组

时间:2017-03-29 11:48:33

标签: c# dictionary generics multidimensional-array

这是这个问题的延续: 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。 我该怎么办?我应该如何访问温度数据?

2 个答案:

答案 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的所有温度