5 / 5 / 2
Регистрация: 17.11.2016
Сообщений: 69
1

Dictionary<int,List<int>> и IReadOnlyDictionary<int,IReadOnlyList<int>>

23.01.2018, 22:00. Показов 2189. Ответов 5
Метки нет (Все метки)

Народ, столкнулся с такой ситуацией.
Есть Переменная
C#
1
2
Dictionaty<int,List<int>> Dic = new Dictionaty<int,List<int>>();
public IReadOnlyDictionary<int,IReadOnlyList<int>> ReadOnly => Dic; //Ошибка приведения типов
Для себя нашел несколько вариантов:
1)
C#
1
2
3
4
5
6
7
8
9
10
11
12
public IReadOnlyDictionary<int,IReadOnlyList<int>> ReadOnly 
{
  get
    {
      Dictionary<int,IReadOnlyList<int>> _return = new Dictionary<int,IReadOnlyList<int>>;
      foreach(var line in Dic)
      {
        _return.Add(Line.key, Line.value);
      }
      return _return;
    }
}
В чем проблема этого приема и так понятно

2)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 public class Dictionary_List : Dictionary<int, List<int>>
    {
        private Dictionary<int, IReadOnlyList<int>> _readOnlyDictionary = new Dictionary<int, IReadOnlyList<int>>();
 
        public new void Add(int key, List<int> value)
        {
            base.Add(key, value);
            _readOnlyDictionary.Add(key, value);
        }
 
        public new void Clear()
        {
            base.Clear();
            _readOnlyDictionary.Clear();
        }
 
        public void Remove(int key)
        {
            base.Remove(key);
            _readOnlyDictionary.Remove(key);
        }
 
        public IReadOnlyDictionary<int, IReadOnlyList<int>> ReadOnlyDictionary => _readOnlyDictionary;
    }
Вариант получше, но тоже с минусами: увеличенные затраты памяти, если таких словарей много, то придется клепать кучу методов.

Есть ли у кого решения как это можно сделать более правильно. Желательно, чтобы это можно было маштабировать на примеры и более глубокой иерархии: List<Dictionary<string, List<int>>>

Добавлено через 7 минут
Унифицировал класс словаря из варианта 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 public class Dictionary_WithReadOnly<TKey, TValue1, TValue2> : Dictionary<TKey, TValue1> where TValue1: TValue2
    {
        private Dictionary<TKey, TValue2> _readOnlyDictionary = new Dictionary<TKey, TValue2>();
 
        public new void Add(TKey key, TValue1 value)
        {
            base.Add(key, value);
            _readOnlyDictionary.Add(key, value);
        }
 
        public new void Clear()
        {
            base.Clear();
            _readOnlyDictionary.Clear();
        }
        
        public void Remove(TKey key)
        {
            base.Remove(key);
            _readOnlyDictionary.Remove(key);
        }
 
        public IReadOnlyDictionary<TKey, TValue2> ReadOnlyDictionary => _readOnlyDictionary;
    }
Но все равно остается проблема излишней траты памяти.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2018, 22:00
Ответы с готовыми решениями:

Dictionary<int, int> получить наибольшее значение value (втрого int)
Dictionary&lt;int, int&gt; bet = new Dictionary&lt;int, int&gt;; bet.Add(1,20); bet.Add(2,50); int i = //...

Как преобразовать Dictionary<string, int> в Dictionary<object, int>
Есть метод с сигнатурой public KeyValuePair&lt;string, int&gt; MyMethod(Dictionary&lt;string, int&gt; dic,...

Как изменить элемент в Dictionary<int,int>?
Мне нужно изменить Value в одном из элементов библиотеки. Вот фрагмент кода. char...

Конструкция Bitmap(int Width, int Height, int stride, PixelFor...
Есть одномерный массив данных data типа byte, int, float (довольно большой; картинка должна...

5
168 / 187 / 35
Регистрация: 21.01.2018
Сообщений: 230
23.01.2018, 23:12 2
Посмотрите в сторону сборщика мусора (grabber collector) вы можете сами проверить с помощью его сколько памяти у вас занимает словарь при увеличении количества значений. Многие говорят, что помогает при принудительной очистки мусора, но это зависит от функционала вашей программы.
0
Usaga
24.01.2018, 06:08
  #3

Не по теме:

Кузнец кода, что за чушь?)

0
168 / 187 / 35
Регистрация: 21.01.2018
Сообщений: 230
24.01.2018, 10:33 4
Не чушь, а реальность https://www.dotnetperls.com/dictionary-memory проверьте сами
1
Эксперт .NET
10004 / 7251 / 1145
Регистрация: 21.01.2016
Сообщений: 27,466
24.01.2018, 10:35 5
Кузнец кода, я в общем, про ваш совет. Он вообще не в тему и не о том. И да, сборщик мусора: "Garbage Collector".
0
168 / 187 / 35
Регистрация: 21.01.2018
Сообщений: 230
24.01.2018, 10:37 6
Опечатался)))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2018, 10:37
Помогаю со студенческими работами здесь

Dictionary<Tuple<string,string>, Dictionary<int,int>> dict - возможно ли?
Собственно вопрос в заголовке. Возможно ли использовать объект вида...

Добавление значений в Dictionary<char, List<int>>
Есть такой dictionary Dictionary&lt;char, List&lt;int&gt;&gt; H = new Dictionary&lt;char,List&lt;int&gt;&gt;(), и лист ...

Работа со словарём в цикле Dictionary<int, List<string>>
Hi! Есть словарик. private static Dictionary&lt;int, List&lt;string&gt;&gt; test = new Dictionary&lt;int,...

Напишите метод int SumOfDigits (int n), вычисляющую сумму цифр числа N
Нужна помощь с некоторыми заданиями из практики Буду очень благодарен, если кто-то действительно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru