当数组似乎不可能使用时,我可以使用什么集合?数据是否需要是不可变的,我可以有一个位置

本文关键字:我可以 位置 是否 数据 有一个 不可变 什么 数组 不可能 可以使 集合 | 更新日期: 2023-09-27 18:02:05

不久前我发布了一个关于我的F1游戏设计决策的问题。一个回复我的人注意到我使用Dictionary<int, Driver>,并问它是干什么用的。我使用这个集合有一个终点位置和一个车手在那个终点位置。他建议我应该使用数组,因为数组有一个索引,可以用作位置。

有一段时间没有制作游戏了,我拾起我离开的地方,开始考虑用数组替换我的字典。我开始搜索数组,一件事让另一件事,我在这里看到一些博客(http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx)关于不使用数组的帖子(或者,实际上,在一些非常特殊的情况下)。

我的问题是:

当数据来自数据库,并且仅用于比较和查找数据时,最好使用什么?我有一个

  • 预测,其中包含驱动程序和预测的终点位置
  • 结果,其中还包含驱动程序和终点位置
  • 积分,其中包含每个正确猜测的车手在某个终点位置的积分

数据来自数据库,不应该被编辑、添加或删除。

数据只被我的代码使用,但这是否意味着我可以安全地使用集合,或者我真的应该在安全的一边,确保从数据库返回的是一个不可变的集合?

第二个问题与位置有关。我可以使用什么集合来获得结束位置,而不需要使用字典的开销?

var prediction = new Driver[3];
            prediction[0] = new Driver(10, "Michael Schumacher");
            prediction[1] = new Driver(7, "Felipe Massa");
            prediction[2] = new Driver(8, "Jensen Button");
            var results = new Driver[3];
            results[0] = new Driver(10, "Michael Schumacher");
            results[1] = new Driver(8, "Jensen Button");
            results[2] = new Driver(9, "Fernando Alonso");
            int[] points = { 25, 18, 15, 12, 10 };
            for (int i = 0; i < prediction.Length; i++)
            {
                if (prediction[i].Equals(results[i]))
                {
                    result += points[i];
                }
            }

当数组似乎不可能使用时,我可以使用什么集合?数据是否需要是不可变的,我可以有一个位置

这取决于你是否想按位置检查(例如:"谁获得第三名?")或按车手(例如:"威尔逊最后的名次是多少?")。这还取决于您是否非常关心某个场景中的性能,这听起来似乎不会对整个应用程序产生真正的影响。

一般来说,字典是很好的查找工具。然而,如果键的范围是已知的、小的、连续的("竞位"符合所有三个条件),那么字典提供的就只是一个数组(并且开销更大)。因此,如果你想按职位查询,请使用数组,因为这是最简单的适合职位描述的工具。

如果您想按驱动程序查询,那么首先您必须回答问题"Driver的身份究竟是如何定义的?"(答案可能是"每个司机都是由他们的姓、名和出生日期唯一标识的")。

然后,您可以使用这些标准使Driver类实现IEquatable<Driver>,并将其放在Dictionary<Driver, Positions>中,我使用下面的类来避免多个字典。

class Positions
{
    public int Predicted { get; set; }
    public int Actual { get; set; }
}

然而,你必须问自己,如果去所有这些麻烦有任何意义vs.有一个数组,例如Tuple<Driver, Positions>和循环数组,每次找到你想要的驱动程序。这在理论上可能听起来效率低下,但如果你只有20个驱动程序,它实际上会比一个字典快得多。

最后,我认为没有必要特意将这些数据结构标记为不可变和/或强制不可变。由于您的应用程序在只读模式下工作,并且它不包括试图将数据推回数据库的代码,因此我认为很明显,在代码中修改数据是没有意义的。

我使用这个集合来获得一个终点位置和一个车手位置终点位置。他建议我使用数组,因为数组有一个可以用作位置的索引。

在这种情况下,他几乎是对的。数组是最好的方法因为你知道有多少个位置而索引就是位置。它将使用最少的内存并获得最高的性能,而且它很简单。我的意思是,您也可以使用List,它实际上只是一个更花哨的数组。

在某些情况下,数组可能是"有害的",但也有一种情况是,当您只需要完成工作时,您应该坚持使用简单的工具。数组简单、容易理解、快速。当你所需要的只是一个驱动程序和一个终点位置时,Array是一个完美的工具。

当数据来自数据库,并且仅用于比较和查找数据,最好使用什么?我有一个

预测,其中包含车手和预测的终点位置结果,其中还包含车手和终点位置点数;其中包含每个正确猜测的驾驶员在a确定终点位置

,视情况而定。您想要一个存储所有信息的集合吗?如果你想,乔恩建议的字典可能是你最好的选择。我想这将是一个很好的方法,因为它在一个地方有你需要的所有东西,你可以使用。

如果您希望每个集合都有不同的集合,那么对于结果和预测结果,您可以为每个集合使用Array(因为数据非常适合它)。对于分数,这有点不同,因为分数不可能是一个完美的索引值集合,您可能有两个结果具有相同的分数。