【问题标题】:Representing a 3D array with keys in C#在 C# 中用键表示 3D 数组
【发布时间】:2017-08-22 21:21:58
【问题描述】:

这是这个问题的延续: Best way to represent sets of 3 values

我想将物质的温度存储为时间和位置的函数。所以温度随位置和时间而变化。关于位置,我将整个材料表面划分为 i*j 个小区域,因此我可以分别为每个区域分配温度。例如,应该能够在 time=3 秒时读取 zone[3,5] 的温度。 我的目标是拥有一个由时间、i 和 j 组成的集合。所以我可以在区域 [i=4, j=7] 的时间 = 3.5 秒时访问温度。 3D 数组没有帮助,因为我需要能够使用时间作为键,如下所示:

temperature[3.5][4,7] 

这里3.5是时间,4是i,7是j。 我该怎么做?我应该如何访问温度数据?

【问题讨论】:

  • 为什么不也使用结构体?
  • 温度等级内的二维数组?或者,“Dictionary>>”,但是,如果有可能,Dictionary 的 api 将不允许“temperature[3.5][4][7]”密钥不存在
  • 你绝对可以通过定义一些结构和重载索引器操作符来实现这一点。
  • 您无法通过简单的数据收集来实现这一目标。这背后的原因是所有这些集合都存储离散的数据集,而您试图将温度存储为时间的连续函数。您必须要么实现一些具有类似集合接口的自定义存储类,要么重新考虑使用该功能的方式。该功能真的是连续温度监测的结果,还是您将其作为一些离散测量值的近似值?

标签: c# dictionary generics multidimensional-array


【解决方案1】:

我认为最好使用Dictionary<float,Dictionary<int,Dictionary<int,float>>>

它会让您使用第一个浮点数(时间)进行索引,它会返回所有区域的字典,其中记录了该给定时间的温度。

然后您可以再次使用 int i 进行索引以获取具有该索引的所有区域,并使用 int j 再次进行索引,然后您最终获得该时间和该区域 i,j 的所有温度

【讨论】:

    【解决方案2】:

    如果你想实现完全相同的接口,那么你应该使用索引器属性。让我们从按位置返回温度的对象开始。我称它为 Surface。您可以使用名称 Area 或任何您认为更合适的名称。该对象应保存您表面上每个位置的温度值,或者它应该从存储中获取这些值:

    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

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      相关资源
      最近更新 更多