基于两个键变量访问对象的最有效集合是什么?
本文关键字:有效 集合 是什么 对象 于两个 变量 访问 | 更新日期: 2023-09-27 18:10:22
我正在尝试实现一个大型对象缓存(多达500000),需要能够以两种不同的方式访问它们…
每个项的键由三个不同的字符串组成;ItemNumber, PubCode和SizeCode。在某些情况下,我将调用对所有这三个值进行匹配以返回单个对象。在其他情况下,我将只调用ItemNumber和PubCode的匹配,以返回对象的集合。
最好的集合是什么?
我考虑过使用一个对象的通用列表(其中所有三个键值都是属性)并使用LINQ来查询它,但是我不相信这将是最高效的方法,特别是当你考虑到集合的大小时。
任何帮助将一如既往地感激!
对于任何ItemNumber/PubCode组合,您可能有多少项?如果答案是"相当少",那么我会从Lookup<ItemNumberPubCode, Value>
(或Dictionary<ItemNumberPubCode, List<Value>>
)开始-所以如果你被要求只查找其中两个,你可以直接找到所有匹配。如果你被要求查找所有三个,你取前两个的所有匹配非常快,然后做一个O(n)扫描任何匹配SizeCode。
(这里ItemNumberPubCode
是封装了ItemNumber
和PubCode
的类型;这可以是匿名类型、Tuple<string, string>
或真实类型。)
如果特定的ItemNumber/PubCode组合可以有多个匹配,那么您可能需要一个Dictionary<ItemNumberPubCode, Dictionary<string, Value>>
-这将让您有效地通过所有三个搜索,并且从其中两个您可以获取字典并使用Values
属性来查找对的所有匹配值
这里有一个使用字典的字典的简单方法。就像Jon说的,你是否需要这个取决于数据。
class TwoKeyDictionary<T> : Dictionary<string, Dictionary<string, T>>
{
public new IEnumerable<T> this[string key1]
{
get { return base[key1].Values; }
}
public T this[string key1, string key2]
{
get { return base[key1][key2]; }
}
public void Add(string key1, string key2, T item)
{
if (!base.ContainsKey(key1))
base[key1] = new Dictionary<string, T>();
base[key1].Add(key2, item);
}
}
基本上,您可以使用树或散列结构进行索引(例如(Sorted)Dictionary) -在您的情况下,您将使用其中三种。你只需要明确你需要什么。
我不知道你的情况,但我猜,这将是足够的,只是缓存基于一个属性,只是使用正常的数据库索引(或多或少与上述相同)为其他情况。
因为它是只读的,所以我将创建一个包含两个集合的非集合类
public class CacheOfManyObjects
{
private Dictionary<string, ObjectsToBeCached> ObjectsByItemPubSize{get;set;}
//You might want to replace the IEnumerable<> with a List<>
// but that depends on implementation
private Dictionary<string, IEnumerable<ObjectsToBeCached>> ObjectsByItemPub{get;set;}
public ObjectsToBeCached GetByItemPubSize(string tString);
public IEnumerable<ObjectsToBeCached> GetByItemPub(string tString);
}
对象将被添加到每个Dictionary中。您将需要额外的逻辑来创建对象缓存,但是没有真正的理由只有一个集合,因为集合本身很小。