我们有一个多租户应用程序,其中运行的站点实例存储在 a 中ConcurrentDictionary<string, SiteInstance>
,其中string
是站点的主机名。
我们现在需要支持每个站点实例的多个主机名。作为临时解决方案,我首先按键搜索,如果未找到匹配项,则对字典执行 LINQ 查询以查找具有匹配主机名的实例。
这里有更好/更快的解决方案吗?
注意:映射到每个站点实例的主机名列表是可变的。
我们有一个多租户应用程序,其中运行的站点实例存储在 a 中ConcurrentDictionary<string, SiteInstance>
,其中string
是站点的主机名。
我们现在需要支持每个站点实例的多个主机名。作为临时解决方案,我首先按键搜索,如果未找到匹配项,则对字典执行 LINQ 查询以查找具有匹配主机名的实例。
这里有更好/更快的解决方案吗?
注意:映射到每个站点实例的主机名列表是可变的。
您不能使用具有相同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();
刚刚写了一个复杂的答案,我看过@Mudu的答案,如果它那么简单,显然是一个更好的方法。无论如何,这是我的……猜想一个优点可能是它很容易扩展。
创建一个继承自 的小类List<String>
,称为 HostNames
. 然后,您可以覆盖该Equals()
方法并GetHashCode()
在列表的任何内容与其他任何内容匹配时返回匹配项。
然后你可以使用这个类作为你的字典键ConcurrentDictionary<HostNames, SiteInstance>
要检索值,您需要构建一个 hostName 对象:
var hostName = new HostNames();
hostName.Add("hostName1");
var siteInstance = concurrentDictionary[hostName];