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

时间:2011-10-03 12:50:56

标签: c# .net

我正在尝试实现一个大型对象缓存(最多500000),并且需要能够以两种不同的方式访问它们......

每个项目的关键字由三个不同的字符串组成; ItemNumber,PubCode和SizeCode。在某些情况下,我将调用所有这三个值的匹配来返回单个对象。在其他情况下,我将仅在ItemNumber和PubCode上调用匹配,以便返回一组对象。

最适合使用的收藏品是什么?

我考虑过只使用一个通用的对象列表(其中所有三个键值都是属性)并使用LINQ来查询它,但我不相信这将是最高性能的方式特别是当你考虑集合的大小时,这样做。

任何帮助都将一如既往地受到赞赏!

4 个答案:

答案 0 :(得分:6)

对于任何ItemNumber / PubCode组合,您可能拥有多少项?如果答案是“相当少”,那么我会从Lookup<ItemNumberPubCode, Value>(或Dictionary<ItemNumberPubCode, List<Value>>)开始 - 所以如果你被要求只抬起其中两个,你可以直截了当所有比赛。如果你被要求全部查找,你可以很快地获取前两个的所有匹配,然后通过SizeCode对任何匹配进行O(n)扫描。

(此处ItemNumberPubCode是封装ItemNumberPubCode的类型;这可以是匿名类型,Tuple<string, string>或真实类型。)

如果特定的ItemNumber / PubCode组合可以有 lot 匹配,那么您可能需要一个Dictionary<ItemNumberPubCode, Dictionary<string, Value>> - 这将让您有效地搜索所有三个,并且只需两个其中你可以获取字典并使用Values属性来查找该对的所有匹配值。

答案 1 :(得分:3)

这是使用词典词典完成此操作的简单方法。像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);
    }
}

答案 2 :(得分:0)

基本上你可以使用树或哈希结构进行索引(例如(Sorted)Dictionary) - 在你的情况下你可以使用其中的三个。 你只需要确切地确定你需要什么。

我不知道你的场景,但我猜想仅基于一个属性进行缓存就足够了,只需使用普通的数据库 - indizes(或多或少与上面相同)。

答案 3 :(得分:0)

由于它是只读的,我会创建一个包含两个集合的非集合类。

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);
}

对象将添加到每个词典中。您将需要额外的逻辑来创建对象缓存,但没有真正的理由只有1个集合,因为集合本身很小。