Оффтопик. Изучаем C#

Автор Тема: Оффтопик. Изучаем C#  (Прочитано 101107 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1596
  • Карма: 350
  • Отец modplus.org
    • ModPlus
Re: Оффтопик. Изучаем C#
« Ответ #135 : 21-12-2017, 11:18:07 »
вместо Swith Case можно использовать словарь (Dictionary<int, Delegate>)
Мне вот только не понятно, как...
У меня в общем цикл, количество итераций count зависит от ввода пользователя. В теле для каждого элемента выполняется стандартный алгоритм один и тот же, только для первого и последнего элемента (он же count) есть дополнительные действия. Если использовать If, то часть кода (стандартный алгоритм) придётся повторно писать, чего не хотелось бы. В VBA такой проблемы не было
Для count можно использовать case switch

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 419
  • Карма: 57
Re: Оффтопик. Изучаем C#
« Ответ #136 : 21-12-2017, 11:18:23 »
Цитировать
Если использовать If, то часть кода (стандартный алгоритм) придётся повторно писать
так ты его в отдельную функию вынеси

Цитировать
Для count можно использовать case switch
нельзя, получишь "constant value is expected"

Оффлайн Мурена

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Re: Оффтопик. Изучаем C#
« Ответ #137 : 21-12-2017, 11:27:18 »
нельзя, получишь "constant value is expected"
Да, именно это я и получаю

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1596
  • Карма: 350
  • Отец modplus.org
    • ModPlus
Re: Оффтопик. Изучаем C#
« Ответ #138 : 21-12-2017, 11:35:52 »
Без примера кода сложно рассуждать

Оффлайн Мурена

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Re: Оффтопик. Изучаем C#
« Ответ #139 : 22-12-2017, 21:22:41 »
Здравствуйте!
Встал вопрос о сохранении объектов в контейнер. Смотрю в сторону использования хеш-таблицы. В качестве ключа планируется использовать структуры с большим количеством полей разных простейших типов (не ссылочных). Как пишут, надо переопределять методы GetHashCode и Equals. Подскажите, пожалуйста, если ключом является структура , надо ли переопределять? если надо, то нормальным ли будет вариант получить конкатенацию из строковых представлений всех полей, или может кто ещё что посоветует. А может и вообще использовать что-то другое в качестве хранилища?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13077
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Оффтопик. Изучаем C#
« Ответ #140 : 23-12-2017, 14:40:14 »
В качестве ключа планируется использовать структуры с большим количеством полей разных простейших типов (не ссылочных).
Ключа или данных?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Мурена

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Re: Оффтопик. Изучаем C#
« Ответ #141 : 23-12-2017, 14:47:33 »
Ключа или данных?
ДА. Так можно? ли это не лучший вариант

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13077
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Оффтопик. Изучаем C#
« Ответ #142 : 23-12-2017, 14:58:37 »
Ключа или данных?
ДА. Так можно? ли это не лучший вариант
Если честно, то мне не приходилось видеть, чтобы в качестве ключа использовали сложную структуру. Обычно ключ это что-то простое (адрес, число, строка, ObjectId), а вот значение может быть сложной структурой/экземпляром класса.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Мурена

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Re: Оффтопик. Изучаем C#
« Ответ #143 : 23-12-2017, 15:06:48 »
У меня объект создаётся на основе геометрических свойств, которые записаны в структуру; объект должен быть уникальным, поэтому предполагается взять хеш-таблицу в качестве хранилища уже созданных объектов, а по ключу - структуре определять, был ли создан экземпляр с такими геометрическими свойствами. Я просто не программист, не имею специального образования, поэтому сложновато разбираться.

Оффлайн Мурена

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Re: Оффтопик. Изучаем C#
« Ответ #144 : 24-12-2017, 14:53:12 »
Кроме как переопределить метод ToString() структуры (чтобы формировал пары "поле"-значение в строку и в конце сделать конкатенацию строк) и вызвать на результате GetHashCode() класса String , ничего не приходит в голову. Буду пока так пробовать

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13077
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Оффтопик. Изучаем C#
« Ответ #145 : 24-12-2017, 16:10:24 »
Кроме как переопределить метод ToString() структуры (чтобы формировал пары "поле"-значение в строку и в конце сделать конкатенацию строк) и вызвать на результате GetHashCode() класса String , ничего не приходит в голову. Буду пока так пробовать
Я тоже не вижу лучшего пути.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Мурена

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Re: Оффтопик. Изучаем C#
« Ответ #146 : 24-12-2017, 16:31:06 »
А не подскажите ещё: как я поняла, механизм метода Hashtable.Add() вычисляет хеш код ключа и смотрит, если есть уже в таблице такой код, то сам (?) вызывает Equals , сравнивая содержимое объектов? И я недопоняла?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13077
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Оффтопик. Изучаем C#
« Ответ #147 : 24-12-2017, 16:36:57 »
А не подскажите ещё: как я поняла, механизм метода Hashtable.Add() вычисляет хеш код ключа и смотрит, если есть уже в таблице такой код, то сам (?) вызывает Equals , сравнивая содержимое объектов? И я недопоняла?
https://msdn.microsoft.com/ru-ru/library/system.collections.hashtable.add(v=vs.110).aspx
Если элемент с таким ключом уже есть, то будет исключение ArgumentException. В .NET исключения обрабатываются достаточно медленно. Так что лучше сначала проверить при помощи Hashtable.Contains нет ли еще такого ключа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Мурена

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
Re: Оффтопик. Изучаем C#
« Ответ #148 : 24-12-2017, 16:56:36 »
Если ключ превращать в строку, то проще, наверно, использовать Dictionary<TKey, TValue> . На этом я, наверно , и остановлюсь.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2465
  • Карма: 694
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Re: Оффтопик. Изучаем C#
« Ответ #149 : 25-12-2017, 13:11:45 »
Структуры могут быть ключом словаря, точно так же, как строка. У них, как и всех других объектов, есть метод Equals, который проверяет, совпадают ли значения полей структуры. Если совпадают - то структуры считаются одинаковыми. Этот метод Equals можно переопределить (если нужно, например, сравнивать не все поля). Также, для удобства сравнения и сортировки значений, можно реализовать интерфейс IComparable<T>.
https://msdn.microsoft.com/ru-ru/library/ms131187(v=vs.110).aspx