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

标签 c# c#-4.0

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

有一段时间没有在游戏上工作了,我从我离开的地方开始考虑用数组替换我的字典。我开始用谷歌搜索数组,一件事让给另一件事,然后我在 SO 上看到了一些帖子,一些博客 ( 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];
                }
            }

最佳答案

这取决于您是想按位置(例如“谁获得第三名?”)还是按车手(例如“Wilson 以什么位置完成?”)来检查。它还取决于您是否非常关心某个场景中的性能,这听起来似乎不会真正对您的应用程序整体产生影响。

通常,字典适合查找。但是,如果键的范围是已知的、小的和连续的(“比赛位置”符合所有三个标准),那么字典只提供数组(并且有更多的开销)。因此,如果您想按职位查询,请使用数组,因为它是符合职位描述的最简单的工具。

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

然后你可以制作 Driver类(class)工具IEquatable<Driver>使用这些标准并将其放入 Dictionary<Driver, Positions>我在这里使用下面的类来避免使用多个词典。

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

但是,您必须问问自己,与拥有一系列例如Tuple<Driver, Positions>并遍历数组以每次找到您想要的驱动程序。这在理论上听起来可能效率低下,但如果您只有 20 个驱动程序,它实际上会比字典快得多。

最后,我认为没有必要特意将这些数据结构标记为不可变和/或强制执行不可变性。由于您的应用程序以只读模式运行,并且它不包含尝试将数据推回数据库的代码,我认为很明显在代码中修改数据毫无意义。

关于c# - 当数组似乎不可能时,我可以使用什么集合?数据是否需要不可变,我可以有一个位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6706452/

相关文章:

jquery - 具有多格式 View 的MVC 3中的Ajax发布

c# - 无法将 ref enum 转换为 ref dynamic?

c# - 如何判断电脑是否有wifi适配器?

c# - 如何告诉正则表达式检查整个子字符串?

c# - 改变 parent 的风格

c# - 使用 Visual Studio 2010 开发 Metro 应用程序?

c# - 在访问以编程方式创建的数据库之前等待?

c# - 谷歌地理定位 API 库

c# - 在验证器中访问 Servicstack.net session

css - 文本在 span 标签中对齐