Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 映射到字典的多列主键<>;。。。aka结构vs.类_C#_.net_Data Structures - Fatal编程技术网

C# 映射到字典的多列主键<>;。。。aka结构vs.类

C# 映射到字典的多列主键<>;。。。aka结构vs.类,c#,.net,data-structures,C#,.net,Data Structures,因此,我一直在努力找出最有效的方法来实现这一技巧: 我在数据库中有一个两列主键(一个int和一个string),我正在尝试创建一个缓存(我喜欢使用字典),我需要有一种方法来引用这两个值作为一个键来取出对象 关键是 private struct PageNameOnSite { public int siteId; public string pageName; } 有人建议我创建一个类来包装它,但这听起来并不是使用内存的最佳方式,因为一旦这个东西放入10000个条目。我的理解是

因此,我一直在努力找出最有效的方法来实现这一技巧:

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

关键是

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

有人建议我创建一个类来包装它,但这听起来并不是使用内存的最佳方式,因为一旦这个东西放入10000个条目。我的理解是,结构的内存占用比类的内存占用要小。

为什么不使用页面名来设置字典的键?您需要覆盖一些内容,但这并不太糟糕

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];
}
publicstaticobjectloopup(字典映射、int-id、字符串名称){
var key=new pagenameinsite(){siteId=id,pageName=name};
返回映射[键];
}

为什么不使用PageName?使用字典的键?您需要覆盖一些内容,但这并不太糟糕

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];
}
publicstaticobjectloopup(字典映射、int-id、字符串名称){
var key=new pagenameinsite(){siteId=id,pageName=name};
返回映射[键];
}

如果你选择了你提到的课程选项。这是很有可能的,代码项目已经发布了一个很好的结果

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


与其将其加载到内存中,也许您应该使用“移动”数据库,大多数功能齐全的数据库提供了这些精简的、易于部署的替代方案。祝你好运

如果你选择了你提到的课程选项。这是很有可能的,代码项目已经发布了一个很好的结果

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


与其将其加载到内存中,也许您应该使用“移动”数据库,大多数功能齐全的数据库提供了这些精简的、易于部署的替代方案。祝你好运

这里有一个关于亲吻的答案:

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


我意识到这不是一种很酷的OOP方式,但如果你的键发生了变化,你无论如何都会改变代码。

下面是一个答案:

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

我意识到这不是一种很酷的OOP方式,但是如果你的键改变了,你还是会改变代码