基于两个键变量访问对象的最有效集合是什么?

本文关键字:有效 集合 是什么 对象 于两个 变量 访问 | 更新日期: 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是封装了ItemNumberPubCode的类型;这可以是匿名类型、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中。您将需要额外的逻辑来创建对象缓存,但是没有真正的理由只有一个集合,因为集合本身很小。