多列主键映射到字典<> ... aka Struct vs. Class

时间:2009-02-18 18:11:32

标签: c# .net data-structures

所以我一直试图找出最有效的方法来解决这个问题:

我在数据库中有一个两列主键(一个int和一个字符串),我正在尝试创建一个缓存(我喜欢使用字典),我需要有一种方法来引用这两个值作为键把对象拿出来。

关键是

private struct PageNameOnSite
{
    public int siteId;
    public string pageName;
}

有人建议我创建一个类来包装它,但这听起来不像是一旦这个东西放入10,000个条目就使用内存的最佳方式。我理解结构的内存占用量小于类的内存占用量。

3 个答案:

答案 0 :(得分:2)

为什么不使用PageNameOnSise键的字典?你需要覆盖一些东西,但它不是太糟糕。

private struct PageNameOnSite
{
    public int siteId;
    public string pageName;
    public override bool Equals(object obj) {
      if ( !obj is PageNameOnSite) { return false; }
      var other = (PageNameOnSite)obj;
      return sideId == other.siteId && StringComparer.Oridinal.Equals(pageName, other.pageName);
   }
   public override int GetHashCode() { return sideId + pageName.GetHashCode(); }
}

然后您可以使用id pageName对

快速查找
public static object Loopup(Dictionary<PageNameOnSite,object> map, int id, string name) {
  var key = new PageNameOnSite() { siteId = id, pageName = name};
  return map[key];
}

答案 1 :(得分:1)

这是一个坚持KISS的答案:

为什么不生成一个字符串作为你的密钥,比如site | page,即对于site = 1和page = default.aspx,使用1 | default.aspx?

我意识到这不是很酷的OOP方式,但如果你的密钥发生变化,你仍然会改变代码。

答案 2 :(得分:0)

如果您选择使用您提到的课程选项。这很有可能,Code Project发布了一个很棒的article

简而言之,您使用类作为键并定义自定义比较器。正如你所说,类可以有比结构更大的足迹,而这个将会。另一个问题是,如果你确实需要在本地使用超大的数据集合,那么可能有更好的方法。

不是将其加载到内存中,也许您应该使用“移动”数据库,大多数完全支持的数据库都提供这些简化的,易于部署的替代方案。祝你好运!