【问题标题】:Operations on Hashtable in C#C#中对Hashtable的操作
【发布时间】:2011-03-27 08:54:33
【问题描述】:

使用 Hashtable 我想让多个对象映射到同一个键。例如。键是“年龄”,值是结构“学生”的对象。

我想在感知上会有一种链表,其中 Key 充当“头” 25->obj1->obj2->obj3

这是我的问题:

上面的表述是否正确? 如果不是,可以是哪种数据结构 用于实现相同的目的?

我可以在上述数据表示中查找特定字段吗?例如一到键 25,我在行中查找名称 'Scott'。我能否停止/获取指向包含字段 Scott 的对象的指针?

谢谢!

【问题讨论】:

标签: c# .net hashtable


【解决方案1】:

如果您使用 C#,最好的选择可能是(本质上,这就是您所提议的):

var collection = new Dictionary<Age, List<Student>>();

假设 Age 和 Student 都是类型。

【讨论】:

  • 为什么不使用ISet 而不是List
  • @Hamish - 在这种情况下,我使用 var 来保存值。我需要作业右侧的具体类型。
  • @Hamish 这完全取决于他对学生的实施。例如 2 个学生可以有相同的名字。相反,他可以使用学生的 ID 并在插入之前比较这两个值。
【解决方案2】:

一个键只能存储一个值。那么Hashtable&lt;int, List&lt;Student&gt;&gt; 呢?

【讨论】:

  • Hashtable 不是通用的,Dictionary> 做同样的事情并为您节省一些转换。
  • 我有一个我称之为 Index 的类型,它本质上是它的包装版本。
【解决方案3】:

如果您在想要创建此数据结构时已经拥有所有学生的集合,则可以这样做

var lookUp = Students.ToLookUp (student => student.Age);

缺点是Lookup &lt;K,V&gt; 数据结构是不可变的。如果这不是一个选项,Dictionary&lt;int, List&lt;Student&gt;&gt; 结构可能更适合其他人提到的。

【讨论】:

    【解决方案4】:

    这里没有错误数据结构可以使用,只是一些结构存储将更适合您的需求,具体取决于您想要对以年龄为键的结果做什么。

    您表示希望在获得特定年龄的学生后能够根据姓名对项目进行查找。在这种情况下,您可能希望有一个 IDictionary&lt;string, Student&gt;,其中的键是学生的名字。

    注意,这是一个高度专业化的结构。如果它不断扩展到您需要在其他方面搜索的位置,您可能需要查看其他选项,因为随着您的选择标准的增加,所需的代码将变得非常难以维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      相关资源
      最近更新 更多