MultiDictionary
От: _NN_ www.nemerleweb.com
Дата: 28.05.20 08:44
Оценка:
Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: ILookup<TKey,TElement>
От: Qbit86 Кипр
Дата: 28.05.20 08:47
Оценка: 14 (2)
Здравствуйте, _NN_, Вы писали:

_NN>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?


Lookup<TKey,TElement>

В отличие от Dictionary, можно обращаться к отсутствующему ключу через индексатор и получать пустую коллекцию вместо KeyNotFoundException.
Глаза у меня добрые, но рубашка — смирительная!
Отредактировано 28.05.2020 8:50 Qbit86 . Предыдущая версия . Еще …
Отредактировано 28.05.2020 8:48 Qbit86 . Предыдущая версия .
Re: MultiDictionary
От: BlackEric http://black-eric.lj.ru
Дата: 28.05.20 08:58
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?

Dictionary<Key, List<Value>> — именно так. Не люблю лишние структуры код тянуть. Хз что из них вылезет.
https://github.com/BlackEric001
Re[2]: MultiDictionary
От: _NN_ www.nemerleweb.com
Дата: 28.05.20 09:02
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, _NN_, Вы писали:


_NN>>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?

BE>Dictionary<Key, List<Value>> — именно так. Не люблю лишние структуры код тянуть. Хз что из них вылезет.

А потому получается, что нужно повсеместно писать код вида

_d.GetOrAdd(key, _ => new List<Value>()).Add(value);
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: ILookup<TKey,TElement>
От: _NN_ www.nemerleweb.com
Дата: 28.05.20 09:02
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>В отличие от Dictionary, можно обращаться к отсутствующему ключу через индексатор и получать пустую коллекцию вместо KeyNotFoundException.


А как его создавать ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: ToLookup()
От: Qbit86 Кипр
Дата: 28.05.20 09:06
Оценка: +1
Здравствуйте, _NN_, Вы писали:

_NN>А как его создавать ?


Через Linq ToLookup().
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: ILookup<TKey,TElement>
От: Jack128  
Дата: 28.05.20 09:09
Оценка: 1 (1)
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, Qbit86, Вы писали:


Q>>В отличие от Dictionary, можно обращаться к отсутствующему ключу через индексатор и получать пустую коллекцию вместо KeyNotFoundException.


_NN>А как его создавать ?

new[]{1,2,3,4}.ToLookup(x => x % 2)

?
Re[4]: ToLookup()
От: _NN_ www.nemerleweb.com
Дата: 28.05.20 09:09
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, _NN_, Вы писали:


_NN>>А как его создавать ?


Q>Через Linq ToLookup().


Так что ли ?

ILookup<int, int> x = new Dictionary<int, int>().ToLookup(k => k.Key, k => k.Value);


А дальше как добавлять элементы ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: MultiDictionary
От: hi_octane Беларусь  
Дата: 28.05.20 09:13
Оценка:
_NN>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?
У меня такие коллекции-монстрики обычно внутри каких-то мудрёных алгоритмов. А для алгоритмов всегда выгодна максимальная заточенность под конкретный сиюминутный случай. Из-за этого сами собой родились экстеншн-методы со странным поведением (например List может быть сортирован по второму ключу, или все элементы в List гарантированно уникальные, Add может возвращать List и позицию куда был добавлен элемент). Причём набор экстеншенов абсолютно неполный: например Add есть, Contains нет, а из Remove только RemoveAll и хватит. Из-за такого "оправданного" раздолбайства использую Dictionary<Key, List<Value>>

Но если бы эта штука из детали реализации вылезла за пределы private/method internal — напрягся и запилил бы класс с достаточно полной реализацией.
Re[5]: ToLookup()
От: Qbit86 Кипр
Дата: 28.05.20 09:13
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>А дальше как добавлять элементы ?


Это создание read-only lookup-таблицы по существующей коллекции.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: SwapRemove
От: Qbit86 Кипр
Дата: 28.05.20 09:18
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>а из Remove только RemoveAll и хватит.


Ещё SwapRemove() можно.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: MultiDictionary
От: _NN_ www.nemerleweb.com
Дата: 28.05.20 09:19
Оценка:
Здравствуйте, hi_octane, Вы писали:

_NN>>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?

_>У меня такие коллекции-монстрики обычно внутри каких-то мудрёных алгоритмов. А для алгоритмов всегда выгодна максимальная заточенность под конкретный сиюминутный случай. Из-за этого сами собой родились экстеншн-методы со странным поведением (например List может быть сортирован по второму ключу, или все элементы в List гарантированно уникальные, Add может возвращать List и позицию куда был добавлен элемент). Причём набор экстеншенов абсолютно неполный: например Add есть, Contains нет, а из Remove только RemoveAll и хватит. Из-за такого "оправданного" раздолбайства использую Dictionary<Key, List<Value>>

_>Но если бы эта штука из детали реализации вылезла за пределы private/method internal — напрягся и запилил бы класс с достаточно полной реализацией.


У меня не алгоритмы , а просто так получается , что имеем такую структуру.
Типа: страна — город — улица — дом

Вот и получаем запросто мультисловари.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: ILookup<TKey,TElement>
От: _NN_ www.nemerleweb.com
Дата: 28.05.20 10:51
Оценка:
Здравствуйте, Jack128, Вы писали:

Q>>>В отличие от Dictionary, можно обращаться к отсутствующему ключу через индексатор и получать пустую коллекцию вместо KeyNotFoundException.


_NN>>А как его создавать ?

J>
J>new[]{1,2,3,4}.ToLookup(x => x % 2) 
J>

J>?

А дальше как добавлять элементы ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: ToLookup()
От: _NN_ www.nemerleweb.com
Дата: 28.05.20 11:12
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, _NN_, Вы писали:


_NN>>А дальше как добавлять элементы ?


Q>Это создание read-only lookup-таблицы по существующей коллекции.


Ну тогда это мне не подходит
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: MultiDictionary
От: karbofos42 Россия  
Дата: 28.05.20 11:35
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?


Примерно так и делаю. Где такое нужно, обычно своя какая-то особенная логика есть и для неё всё равно нужно делать некую обёртку с ограниченным набором операций.
Re[5]: ILookup<TKey,TElement>
От: Jack128  
Дата: 28.05.20 14:22
Оценка: +1
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, Jack128, Вы писали:


Q>>>>В отличие от Dictionary, можно обращаться к отсутствующему ключу через индексатор и получать пустую коллекцию вместо KeyNotFoundException.


_NN>>>А как его создавать ?

J>>
J>>new[]{1,2,3,4}.ToLookup(x => x % 2) 
J>>

J>>?

_NN>А дальше как добавлять элементы ?


Никак. Иммутабельность, функциональщина, все дела :-D
Re: MultiDictionary
От: Ночной Смотрящий Россия  
Дата: 29.05.20 18:07
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?


У меня оно обычно многопоточное, поэтому в 90% случаев вполне хватает ConcurrentDictionary.GetOrAdd
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: MultiDictionary
От: _NN_ www.nemerleweb.com
Дата: 30.05.20 04:12
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, _NN_, Вы писали:


_NN>>Какм MultiDictionary пользуетесь или в коде пишете Dictionary<Key, List<Value>> ?


НС>У меня оно обычно многопоточное, поэтому в 90% случаев вполне хватает ConcurrentDictionary.GetOrAdd


Это не решает проблемы как добавить множество значений для одного ключа.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: MultiDictionary
От: Ночной Смотрящий Россия  
Дата: 30.05.20 05:48
Оценка: +1
Здравствуйте, _NN_, Вы писали:

_NN>Это не решает проблемы как добавить множество значений для одного ключа.


Почему не решает? dic.GetOrAdd(key, key => new List<TValue>()).Add(value).
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: MultiDictionary
От: hi_octane Беларусь  
Дата: 30.05.20 11:25
Оценка:
НС>У меня оно обычно многопоточное
НС>Почему не решает? dic.GetOrAdd(key, key => new List<TValue>()).Add(value).
Это в многопотоке сломается
И простого способа починить как-то не видно.
Миксовать обычные и Concurrent коллекции вообще шутка опасная.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.