Здравствуйте, _NN_, Вы писали:
_NN>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?
Dictionary<Key, List<Value>> — именно так. Не люблю лишние структуры код тянуть. Хз что из них вылезет.
Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, _NN_, Вы писали:
_NN>>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ? BE>Dictionary<Key, List<Value>> — именно так. Не люблю лишние структуры код тянуть. Хз что из них вылезет.
А потому получается, что нужно повсеместно писать код вида
_d.GetOrAdd(key, _ => new List<Value>()).Add(value);
Здравствуйте, Qbit86, Вы писали:
Q>В отличие от Dictionary, можно обращаться к отсутствующему ключу через индексатор и получать пустую коллекцию вместо KeyNotFoundException.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, Qbit86, Вы писали:
Q>>В отличие от Dictionary, можно обращаться к отсутствующему ключу через индексатор и получать пустую коллекцию вместо KeyNotFoundException.
_NN>А как его создавать ?
_NN>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?
У меня такие коллекции-монстрики обычно внутри каких-то мудрёных алгоритмов. А для алгоритмов всегда выгодна максимальная заточенность под конкретный сиюминутный случай. Из-за этого сами собой родились экстеншн-методы со странным поведением (например List может быть сортирован по второму ключу, или все элементы в List гарантированно уникальные, Add может возвращать List и позицию куда был добавлен элемент). Причём набор экстеншенов абсолютно неполный: например Add есть, Contains нет, а из Remove только RemoveAll и хватит. Из-за такого "оправданного" раздолбайства использую Dictionary<Key, List<Value>>
Но если бы эта штука из детали реализации вылезла за пределы private/method internal — напрягся и запилил бы класс с достаточно полной реализацией.
Здравствуйте, hi_octane, Вы писали:
_NN>>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ? _>У меня такие коллекции-монстрики обычно внутри каких-то мудрёных алгоритмов. А для алгоритмов всегда выгодна максимальная заточенность под конкретный сиюминутный случай. Из-за этого сами собой родились экстеншн-методы со странным поведением (например List может быть сортирован по второму ключу, или все элементы в List гарантированно уникальные, Add может возвращать List и позицию куда был добавлен элемент). Причём набор экстеншенов абсолютно неполный: например Add есть, Contains нет, а из Remove только RemoveAll и хватит. Из-за такого "оправданного" раздолбайства использую Dictionary<Key, List<Value>>
_>Но если бы эта штука из детали реализации вылезла за пределы private/method internal — напрягся и запилил бы класс с достаточно полной реализацией.
У меня не алгоритмы , а просто так получается , что имеем такую структуру.
Типа: страна — город — улица — дом
Здравствуйте, Jack128, Вы писали:
Q>>>В отличие от Dictionary, можно обращаться к отсутствующему ключу через индексатор и получать пустую коллекцию вместо KeyNotFoundException.
_NN>>А как его создавать ? J>
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, _NN_, Вы писали:
_NN>>А дальше как добавлять элементы ?
Q>Это создание read-only lookup-таблицы по существующей коллекции.
Здравствуйте, _NN_, Вы писали:
_NN>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?
Примерно так и делаю. Где такое нужно, обычно своя какая-то особенная логика есть и для неё всё равно нужно делать некую обёртку с ограниченным набором операций.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, Jack128, Вы писали:
Q>>>>В отличие от Dictionary, можно обращаться к отсутствующему ключу через индексатор и получать пустую коллекцию вместо KeyNotFoundException.
_NN>>>А как его создавать ? J>>
J>>new[]{1,2,3,4}.ToLookup(x => x % 2)
J>>
J>>?
_NN>А дальше как добавлять элементы ?
Никак. Иммутабельность, функциональщина, все дела :-D
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, _NN_, Вы писали:
_NN>>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?
НС>У меня оно обычно многопоточное, поэтому в 90% случаев вполне хватает ConcurrentDictionary.GetOrAdd
Это не решает проблемы как добавить множество значений для одного ключа.
НС>У меня оно обычно многопоточное НС>Почему не решает? dic.GetOrAdd(key, key => new List<TValue>()).Add(value).
Это в многопотоке сломается
И простого способа починить как-то не видно.
Миксовать обычные и Concurrent коллекции вообще шутка опасная.