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