我们有一个多租户应用程序,其运行的站点实例存储在ConcurrentDictionary<string, SiteInstance>中,其中string是站点的主机名。
我们现在要求每个站点实例支持多个主机名。作为一种临时解决方案,我首先按键进行搜索,如果没有找到匹配项,则对字典执行LINQ查询,以查找具有匹配主机名的实例。
这里有没有性能更好/更快的解决方案?
注:映射到每个站点实例的主机名列表是可变的。
发布于 2012-10-30 18:27:57
您可以不使用具有相同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 (但不是threadsafe ):
var instances = dict.Values.Distinct();发布于 2012-10-30 18:32:24
刚刚写了一个复杂的答案,我已经看到了@Mudu的答案,如果真的这么简单,它显然是一个更好的方法。不管怎样,这是我的..。我猜它的一个优点是它很容易扩展。
创建一个名为HostNames的继承自List<String>的小类。然后,如果列表中的任何内容与其他内容匹配,则可以覆盖Equals()方法和GetHashCode()以返回匹配。
然后,您可以将这个类用作字典键ConcurrentDictionary<HostNames, SiteInstance>
要检索值,您需要构建一个hostName对象:
var hostName = new HostNames();
hostName.Add("hostName1");
var siteInstance = concurrentDictionary[hostName];https://stackoverflow.com/questions/13136970
复制相似问题