代码之家  ›  专栏  ›  技术社区  ›  char m

是否有一个.NET C集合支持通过唯一键和非唯一字段进行提取?

  •  1
  • char m  · 技术社区  · 15 年前

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

    谢谢!

    比尔:Matti

    编辑:vs 2005和.NET 2.0

    3 回复  |  直到 15 年前
        1
  •  1
  •   elmar    15 年前

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

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

        2
  •  1
  •   Tarydon    15 年前

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

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

    然后:

    Dictionary<int, LinkedList<Employee>> EmpsByDept; 
    

    我在这里使用LinkedList以获得最快的插入/删除性能。你也可以使用列表。

        3
  •  0
  •   Sergey Teplyakov    15 年前

    我认为你应该根据不同的需要使用不同的收藏品。 例如,可以将此逻辑封装到一个类中,该类包含多个针对特定需求优化的容器:

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