多键字典/列表

时间:2012-10-30 10:24:12

标签: c#

我们有一个多租户应用程序,其中运行的网站实例存储在ConcurrentDictionary<string, SiteInstance>中,其中string是该网站的主机名。

我们现在要求每个站点实例支持多个主机名。作为临时解决方案,我首先按键搜索,如果找不到匹配项,则对字典执行LINQ查询以查找具有匹配主机名的实例。

这里有更好/更快的解决方案吗?

注意:映射到每个站点实例的主机名列表是可变的。

2 个答案:

答案 0 :(得分:2)

您是否可以使用具有相同SiteInstance和不同密钥的多个键值对?

var instance = new SiteInstance();
dict.TryAdd("hostname1", instance); // in actual code, you should check
dict.TryAdd("hostname2", instance); // TryAdd's return value

主机名必须是唯一的。要访问不同的 SiteInstance对象(由于注释而编辑),您可以使用额外的HashSet<SiteInstance>或使用LINQ(但不是线程安全):

var instances = dict.Values.Distinct();

答案 1 :(得分:2)

刚刚写了一个复杂的答案,我已经看过@Mudu的答案,如果它很简单,这显然是一个更好的方法。无论如何,这是我的...猜测一个优势可能是这很容易扩展。

创建一个继承自List<String>的小类,名为HostNames。然后,如果列表中的任何内容与其他任何内容匹配,您可以覆盖Equals()方法和GetHashCode()以返回匹配。

然后,您可以将此类用作词典键ConcurrentDictionary<HostNames, SiteInstance>

要检索构建hostName对象所需的值:

var hostName = new HostNames();
hostName.Add("hostName1");
var siteInstance = concurrentDictionary[hostName];