是否有一个.NET C#集合,支持由唯一键和非唯一字段提取?

时间:2010-01-19 09:11:39

标签: c# collections indexing

我需要有一些Collections.Generic.Dictionary项目,我可以通过它的id作为键来获取结构。然后我需要通过另一个字段获取许多结构,比如所有项目的1%或更少。像非唯一索引的游标一样。使用Dictionary我必须浏览所有值并检查哪个值具有该字段的正确值。我的问题是:“我应该使用什么数据结构来支持RDBMS中的这种独特索引和非唯一索引行为?”

谢谢!

br:马蒂

编辑:VS 2005和.NET 2.0

3 个答案:

答案 0 :(得分:1)

如果表现很重要,一个选项是维护列表字典。例如,假设你有:

class Employee {
    int DeptID;   // A non-unique field we want to index on
    ...
}

然后:

Dictionary<int, LinkedList<Employee>> EmpsByDept; 

我在这里使用LinkedList来获得最快的插入/删除性能。您也可以使用List。

答案 1 :(得分:1)

我不相信有一个内置字典像集合接受非唯一TKey值,但您可能对以下项目感兴趣:

http://www.codeproject.com/KB/cs/Multi-Index_Container.aspx

答案 2 :(得分:0)

我认为您应该针对不同的需求使用不同的集合。 例如,您可以将此逻辑封装到一个类中,该类包含针对特定需求进行了优化的多个容器:

class Key {}

class Value {}

class MySpecificStorage
{
    public void AddSomeEntry(Key key, Value value)
    {
        dictionary[key] = value;
        values.Add(value);
    }
    public Value FindValueByKey(Key key)
    {
        //very simple
        return dictionary[key];
    }
    public IEnumerable<Value> GetSomeRange()
    {
        //use LINQ or something else
        //to fetch many structs, say 1% or less of all items, by another field.
        //You can even use different Dictionaries for that
        return ...;
    }

    private Dictionary<Key, Value> dictionary = new Dictionary<Key, Value>();
    private List<Value> values = new List<Value>(); //or List<KeyValuePair<Key, Value>> values;

}