我正在尝试实现一个大型对象缓存(最多500000),并且需要能够以两种不同的方式访问它们......
每个项目的关键字由三个不同的字符串组成; ItemNumber,PubCode和SizeCode。在某些情况下,我将调用所有这三个值的匹配来返回单个对象。在其他情况下,我将仅在ItemNumber和PubCode上调用匹配,以便返回一组对象。
最适合使用的收藏品是什么?
我考虑过只使用一个通用的对象列表(其中所有三个键值都是属性)并使用LINQ来查询它,但我不相信这将是最高性能的方式特别是当你考虑集合的大小时,这样做。
任何帮助都将一如既往地受到赞赏!
答案 0 :(得分:6)
对于任何ItemNumber / PubCode组合,您可能拥有多少项?如果答案是“相当少”,那么我会从Lookup<ItemNumberPubCode, Value>
(或Dictionary<ItemNumberPubCode, List<Value>>
)开始 - 所以如果你被要求只抬起其中两个,你可以直截了当所有比赛。如果你被要求全部查找,你可以很快地获取前两个的所有匹配,然后通过SizeCode对任何匹配进行O(n)扫描。
(此处ItemNumberPubCode
是封装ItemNumber
和PubCode
的类型;这可以是匿名类型,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个集合,因为集合本身很小。