Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2017, 16:14   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Объединение однотипных Dictionary

Здравствуйте. Есть два словарика, у обоих типы данных - Dictionary<UnitType,int>.
UnitType - это enum.
Важное условие: в одном словаре может присутствовать ключ, который в другом словаре может отсутствовать. Так же - нулевое значение для какого либо ключа недопустимо.
Нужно организовать полное слияние этих словарей по закону:
к значению каждого ключа первого словаря добавить количество этого же ключа во втором словаре; если в первом или втором словаре отсутствует какой либо ключ, но присутствует в одном из этих словарей - ключ с количеством должен быть в результате слияния.

Это нужно реализовать только руками ? Иль уже есть готовый метод ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 13.04.2017, 16:34   #2
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Что то вроде соорудил, но нет возможности смоделировать ситуацию, в которой эта функция понадобится. Долго объяснять.
Помогите пожалуйста проверить правильность решения поставленной задачи.
Код:
static Dictionary<UnitType,int> FusionMilitary(Dictionary<UnitType,int> first, Dictionary<UnitType,int> second)
{
	UnitType[] types=new UnitType[] { UnitType.Cavalry, UnitType.Infantry, UnitType.Militia, UnitType.Ranged };
	int i=0,currentSum,tmp;
	Dictionary<UnitType,int> result=new Dictionary<UnitType,int>();
	for (;i<types.Length;i++)
	{
		currentSum=0;
		if (first.TryGetValue(types[i],out tmp))
			currentSum+=tmp;
		else {}
		if (second.TryGetValue(types[i],out tmp))
			currentSum+=tmp;
		else {}
		if (currentSum>0)
			result.Add(types[i],currentSum);
		else {}
	}
	types=null;
	return result;
}
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 13.04.2017, 17:16   #3
hoolygan
Пользователь
 
Регистрация: 11.04.2017
Сообщений: 64
По умолчанию

1. Зачем пустые блоки else {}?
2. Обнулять types необязательно - при выходе из метода, когда система посчитает это допустимым - сборщик сам удалит объект.
А в остальном - почему бы и нет.
hoolygan вне форума Ответить с цитированием
Старый 13.04.2017, 18:35   #4
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от hoolygan Посмотреть сообщение
1. Зачем пустые блоки else {}?
Это мой code-style; с практической точки зрения - при большом количестве вложений могу запутаться в разветвлениях. Выход - ввести в привычку писать все части конструкций.
Цитата:
Сообщение от hoolygan Посмотреть сообщение
2. Обнулять types необязательно
Я знаю про сборщик; опять же - вопрос привычки ... На плюсах сборкой мусора никто не занимается, не хочу отвыкать.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 13.04.2017, 20:51   #5
hoolygan
Пользователь
 
Регистрация: 11.04.2017
Сообщений: 64
По умолчанию

Ну как бы Dispose() и null это совершенно разные вещи, а разве на плюсах обнуление ссылки высвобождает память?
hoolygan вне форума Ответить с цитированием
Старый 13.04.2017, 22:00   #6
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

hoolygan, высвобождение ссылки не освобождает память ...
Яж говорю, тут чисто вопрос привычки, что бы я не забывал подчищать за собой.
Я делаю Dispose() там, где он есть. Конкретно здесь его нет.
И, конкретно в этой ситуации для высвобождения памяти массива на плюсах нужно было бы написать delete[] types.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 14.04.2017, 08:32   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
практической точки зрения - при большом количестве вложений могу запутаться в разветвлениях.
такое может произойти если только забивать на офф гайдлайны или писать в блокноте(и то сложно).
хотя насколько я помню, с вами на этот счет разговаривать бесполезно.

а чего бы не так?
работает на любом количестве словарей.
Код:
static Dictionary<UnitType,int> FusionMilitary(params Dictionary<UnitType,int>[] dicts)
{
   var result=new Dictionary<UnitType,int>();
   foreach(var dict in dicts)
   {
      int curCount;
      if(result.TryGetValue(dict.Key, out curCount))
          result[dict.Key]=curCount+dict.Value;
      else
          result[dict.Key]=dict.Value;
   }
}

var combined=FusionMilitary(first,second,third)
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
опять же - вопрос привычки ...
советую избавляться от привычки писать ненужный код.
С++ это С++, C# это C#.
я пишу не на одном языке, и мне ж как-то это не мешает.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.04.2017, 17:31   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Код:
var a = new Dictionary<string, int>();
            var b = new Dictionary<string, int>();

            a.Add("a", 1);
            a.Add("b", 2);
            a.Add("d", 3);
            a.Add("e", 5);

            b.Add("a", 4);
            b.Add("b", 3);
            b.Add("c", 5);
            b.Add("d", 2);

            var c = a.Concat(b).GroupBy(item => item.Key).Select(sumitem => new KeyValuePair<string, int>(sumitem.Key, sumitem.Sum(item => item.Value))).ToDictionary(x => x.Key, x => x.Value);
pu4koff вне форума Ответить с цитированием
Старый 14.04.2017, 18:22   #9
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
забивать на офф гайдлайны
Это про меня.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
я пишу не на одном языке, и мне ж как-то это не мешает
В этом и проблема. Вы - это вы. Я - это я.
Со мной разговаривать об этом бесполезно.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dictionary<TKey, TValue>(Int32) hoz Общие вопросы .NET 7 16.12.2015 20:58
C++ Реализовать класс Dictionary lixod96 Visual C++ 0 12.12.2014 17:22
Объединение однотипных csv файлов myosotis Microsoft Office Excel 4 29.01.2013 23:23
вопрос по Dictionary atagilov C# (си шарп) 2 08.10.2011 16:11
Dictionary bank_notes Microsoft Office Excel 3 23.02.2010 01:12