Здравствуйте, _NN_, Вы писали:
_NN>Что думаете ?
Ну, я бы просто подрубил MultiValueDictionary, он произвольные коллекции умеет.
Если нет — как насчёт
* возвращать bool в перегрузке, которая HashSet<T> принимает.
* отказаться от перегрузок для IList|ICollection. Есть риск в итоге получить словарь с разнотипными коллекциями в Values.
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, _NN_, Вы писали:
_NN>>Что думаете ? S>Ну, я бы просто подрубил [url=https://github.com/dotnet/corefxlab/blob/master/src/System.Collections.Generic.MultiValueDictionary/System/Collections/Generic/MultiValueDictionary.cs S>]MultiValueDictionary[/url], он произвольные коллекции умеет.
Это другое.
Также есть ещё PowerCollections.MultiDictionary с немного другим интерфейсом.
Тут переделывал код и хотелось что-нибудь с меньшими изменениями.
S>Если нет — как насчёт S>* возвращать bool в перегрузке, которая HashSet<T> принимает.
Принято. S>* отказаться от перегрузок для IList|ICollection. Есть риск в итоге получить словарь с разнотипными коллекциями в Values.
Ну если тип IColletion , а кто-то приводит в другой тип то как бы сам напрашивается на неприятности.
Это как если бы функция возвращала IDictionary, а его приводят к Dictionary.
S>Имена ок.
Здравствуйте, _NN_, Вы писали:
_NN>Ну если тип IColletion , а кто-то приводит в другой тип то как бы сам напрашивается на неприятности.
Всё равно неочевидно, имхо. Или явно factory передавать, или будут wtf.
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, _NN_, Вы писали:
_NN>>Ну если тип IColletion , а кто-то приводит в другой тип то как бы сам напрашивается на неприятности. S>Всё равно неочевидно, имхо. Или явно factory передавать, или будут wtf.
Наследоваться можно даже и от List<T> и от Dictionary<K,V> и удивляться также.
Не думаю, что фабрика тут поможет если имеем нисходящее приведение типов без оглядки.
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, _NN_, Вы писали:
_NN>>Ну если тип IColletion , а кто-то приводит в другой тип то как бы сам напрашивается на неприятности. S>Всё равно неочевидно, имхо. Или явно factory передавать, или будут wtf.
Здравствуйте, _NN_, Вы писали:
_NN>пинг.
Сорри
Я по-прежнему против варианта с IList/ICollection. Это прямой путь к аду с разнотипными коллекциями. В тред призывается остальной народ)
Можем сделать AddToValues<TKey, TCollection, TValue> ... where TCollection: new(), IColection<TValue>. Естественно, теряем на Activator.CreateInstance<T>(), но тут уж ничего не поделать. Не эмитить же.
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, _NN_, Вы писали:
_NN>>пинг. S>Сорри S>Я по-прежнему против варианта с IList/ICollection. Это прямой путь к аду с разнотипными коллекциями. В тред призывается остальной народ)
Т.е. решаем ситуацию когда автор написал IList и везде пользуется им как List с явными преобразованиями ?
Это изначально ошибочный код, и даже без AddToValues легко его поломать.
Может тогда сразу в КСВ , там больше тусуется заодно и другие острые темы затронуть можно
S>Можем сделать AddToValues<TKey, TCollection, TValue> ... where TCollection: new(), IColection<TValue>. Естественно, теряем на Activator.CreateInstance<T>(), но тут уж ничего не поделать. Не эмитить же.
А как это решает проблему ? Можно явно передавать тип коллекции конечно, но идея в том чтобы этого не делать.
Хотелось бы всё таки включить функционал в библиотеку.
Что насчёт другого именования ?
Например AddToList или AddOrCreateList
Это достаточно точно описывает, что создаётся List<T> ?
По аналогии можно сделать AddToHashSet/AddOrCreateHashSet.
var d = new Dictionary<string, ICollection<int>>();
d.AddOrCreateList("a", 1);
Assert.AreEqual(1, d["a"].First());
d["b"] = new List<int> { 2 };
d.AddOrCreateList("b", 3);