Есть ли коллекция .NET C #, которая поддерживает выборку по уникальным ключам и неуникальным полям? - PullRequest
1 голос
/ 19 января 2010

Мне нужно иметь элементы в виде Collections.Generic.Dictionary, где я могу получить структуру по ее идентификатору в качестве ключа. Затем мне нужно получить много структур, скажем, 1% или менее всех элементов, из другого поля. Как курсор по неуникальному индексу. С помощью словаря я должен просмотреть все значения и проверить, какое значение имеет правильное значение для этого поля. У меня вопрос: «Какую структуру данных мне следует использовать для поддержки такого уникального индекса и неуникального поведения индекса, обнаруженного в СУРБД?»

Спасибо!

br: Matti

РЕДАКТИРОВАТЬ: VS 2005 и .NET 2.0

Ответы [ 3 ]

1 голос
/ 19 января 2010

Я не верю, что есть встроенный словарь, подобный коллекции, принимающей неуникальные значения TKey, но вас может заинтересовать следующий проект:

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

1 голос
/ 19 января 2010

Одним из вариантов, если производительность важна, является ведение словаря списков.Например, предположим, что у вас было:

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

Тогда:

Dictionary<int, LinkedList<Employee>> EmpsByDept; 

Я использую LinkedList здесь, чтобы получить самую быструю производительность вставки / удаления.Вы также можете использовать список.

0 голосов
/ 19 января 2010

Я думаю, вы должны использовать разные коллекции для разных нужд. Например, вы можете инкапсулировать эту логику в один класс, который содержит несколько контейнеров, оптимизированных для конкретных нужд:

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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...