Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 25.11.2018
Сообщений: 65

Структура ветвления Select Case

05.12.2019, 17:25. Показов 2522. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, есть задание:

Запрограммировать диалог с пользователем, в котором пользователь может отвечать на ваши вопросы по-русски (да, Да, ДА, Нет, НЕТ, нет) или по-английски (no, NO, No, YES, n, N, Y, y, Yes, yes, yES, yeS). В случае согласия (в любой доступной форме) выполняются одни действия, в случае отказа (также в одной из допустимых форм) выполняются другие действия.

Я реализовал это так:
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
25
26
27
28
private void button1_Click(object sender, EventArgs e)
        {
            string s = textBox1.Text.ToString();
            switch(s)
            {
                case "ДА":
                case "Да":
                case "да":
                case "YES":
                case "Yes":
                case "yes":
                case "Y":
                case "y":
                    MessageBox.Show("Файл сохранен!");
                    break;
 
                case "НЕТ":
                case "Нет":
                case "нет":
                case "NO":
                case "No":
                case "no":
                case "N":
                case "n":
                    MessageBox.Show("Файл удален!");
                    break;
            }
         }
Вопрос: как это можно сделать иначе, сократив код? Буду благодарен за ответ.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.12.2019, 17:25
Ответы с готовыми решениями:

Объединение case в условии swtich case
Всем приветы! Скажите, можно ли объединить case'ы в более сокращенный вид, что бы не было, как у меня? А то, у меня таких swithc'ей 3...

Как использовать цикл ветвления select case
Написал вот такой код могли бы вы подсказать ,ЧТО НЕ ТАК подчёркивает вот тут Case ByVal Function getprogram(ByVal val As String)...

Написать программу для вычисления значения функции с использованием операторов ветвления If и выбора Select Case
Во вложении функция. Задание: Написать программу для вычисления значения функции с использованием операторов ветвления If и выбора Select...

31
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
05.12.2019, 17:28
C#
1
2
3
4
var yes = new string[]{"yes","y","да"};
 
string s = textBox1.Text.ToLower();
if(yes.Contains(s)) MessageBox.Show("Файл сохранен!");
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,086
Записей в блоге: 2
05.12.2019, 17:33
ttssooyy, может это вам так по заданию надо - не знаю.
Но это очень плохой код.

Посмотрите такой пример
C#
1
2
3
4
5
6
7
8
9
10
11
12
private readonly string [] yes = {"yes", "y", "да"};
private readonly string [] not = {"no", "n", "нет"};
private void button1_Click(object sender, EventArgs e)
{
    string s = textBox1.Text.ToLower();
    if(yes.Contains(s))
         MessageBox.Show("Файл сохранен!");
    else if(not.Contains(s))
          MessageBox.Show("Файл удален!");
    else
          MessageBox.Show("НЭ понял!");
 }
0
Эксперт .NET
 Аватар для Usaga
14289 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,330
05.12.2019, 17:35
Diamante, Элд Хасп, можно поэффективней:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
 
namespace ConsoleApp2
{
    class Program
    {
        private static readonly ICollection<string> yes 
            = new HashSet<string>(new[] { "yes", "y", "да", "ага" }, StringComparer.OrdinalIgnoreCase);
 
        static void Main(string[] args)
        {
            if (yes.Contains("Да"))
            {
                Console.WriteLine("Файл сохранён");
            }
        }
    }
}
1
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
05.12.2019, 17:39
Usaga, согласен, но, кмк, ТСу нужно что-то попроще, а проще массива некуда, разве что 100500 кейсов
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,086
Записей в блоге: 2
05.12.2019, 17:40
Usaga, эффективнее в каком ракурсе?
Скорость поиска?

Вроде линейный поиск на очень маленьких массивах быстрее чем хеш поиск.

Добавлено через 21 секунду
Usaga, или я ошибаюсь?
0
Эксперт .NET
 Аватар для Usaga
14289 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,330
05.12.2019, 17:42
Элд Хасп, поэффективней в двух моментах:
1) Работает со строками в любом регистре: не нужно создание временной строки через ToLower();
2) Хеш-таблица, поиск очень быстрый (имеет смысл при большем, чем несколько элементов массиве);

Основной мой косёрн - ToLower().
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
05.12.2019, 17:42
как минимум, не создается дополнительная строка
да хешсет быстрее вроде как...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,086
Записей в блоге: 2
05.12.2019, 17:53
Diamante, быстрее только если хотя бы несколько десятков элементов.
Границу эффективности надо определять тестом.
Если не лень - сделайте тест.
Самому интересно, но я пока без компа.

Добавлено через 2 минуты
Usaga, экономия промежуточной строки при пользовательском вводе на форме?
Даже не знаю сколько и с какой скоростью надо вводить чтобы это стало существенным.
0
Эксперт .NET
 Аватар для Usaga
14289 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,330
05.12.2019, 17:57
Элд Хасп, где-то в недрах .NET таится древний HybridDictionary, который опирается на значение 10-15 (если амнезия не изменяет) элементов перед сменой внутреннего списка на хеш-таблицу. Но, как я уже ранее сказал, основной выигрышь не в скорости поиска, а в отказе от мусора генерируемого методом ToLower().

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
экономия промежуточной строки при пользовательском вводе на форме?
Даже не знаю сколько и с какой скоростью надо вводить чтобы это стало существенным.
А теперь представьте, что вам эти строки идут из разных источников. Теперь встаёт не только вопрос эффективности, но и не забыть вызвать ToLower() над каждой входной строкой. И ещё ToLower() на каждым элементом массива, с которым будет сравнение. И уже предложенный мной подход не кажется таким уж через чур высосанным из пальца?)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,086
Записей в блоге: 2
05.12.2019, 18:06
Usaga, но это же совсем иная задача.
Для такой задачи, конечно, нужно иное решение.
Но имеет ли смысл для простых, элементарных разовых задач создавать обобщёные методы на все случаи жизни?

Добавлено через 3 минуты
Usaga, и если для постоянных списков, по-моему, бинарный поиск быстрее хеш поиска?
0
Эксперт .NET
 Аватар для Usaga
14289 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,330
05.12.2019, 18:12
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но имеет ли смысл для простых, элементарных разовых задач создавать обобщёные методы на все случаи жизни?
Да, имеет. Это вам ничего не будет стоить, если вы уже знаете как это делать.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
и если для постоянных списков, по-моему, бинарный поиск быстрее хеш поиска?
Неверный вопрос. Это зависит исключительно от данных с которыми работаете. Тут нет золотой пули.
0
68 / 38 / 11
Регистрация: 07.11.2019
Сообщений: 136
05.12.2019, 18:16
Какие хэш-таблицы...

Цитата Сообщение от Diamante Посмотреть сообщение
if(yes.Contains(s)) MessageBox.Show("Файл сохранен!");
C#
1
if (yes.Contains(s, StringComparer.OrdinalIgnoreCase))...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,086
Записей в блоге: 2
05.12.2019, 18:19
Цитата Сообщение от Ourn
Какие хэш-таблицы...
Речь идёт о типе в котором хранятся перечни допустимых значений: стринги массив или хеш таблица строк.
0
68 / 38 / 11
Регистрация: 07.11.2019
Сообщений: 136
05.12.2019, 18:27
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Речь идёт о типе в котором хранятся перечни допустимых значений: стринги массив или хеш таблица строк.
Да, я понимаю. Не понимаю зачем усложнять код в задаче, где в этом нет необходимости. Сколько миллисекунд вы надеетесь выиграть?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,086
Записей в блоге: 2
05.12.2019, 19:17
Ourn, да, это та принципе не к этой задаче относится.
По ней понятно, что чем проще тем лучше.
Обсуждение о более общених принципах применении тех или иных методов, типов.
0
68 / 38 / 11
Регистрация: 07.11.2019
Сообщений: 136
05.12.2019, 20:28
Элд Хасп,
тогда я бы добавил к обсуждению принципов читаемость и поддерживаемость кода, и наверно некоторый прагматизм.

Вот есть например такой класс List. Мы же понимаем, что под капотом у него не список, а массив с реализованным набором операций над этим массивом. Но есть же LinkedList - настоящий список, у которого есть вставки, удаления элементов не посредством копирования частей массива. Но LinkedList не так часто можно увидеть в коде. И не потому что программисты плохие - есть сформированная культура, привычки, примеры, которые даются в статьях и книгах - как итог List популярен. И вставляешь его механически в те места, где тебе нужен set данных.
И тут вдруг в коде появляется LinkedList или HashTable - а код написан кем-то другим, со своей логикой, подходами и извращениями и ты начинаешь думать - а зачем - наверное есть веская причина, чтобы использовать LinkedList, а не обычный List. Так вот, когда такая причина реально есть, мне, как человеку, разбирающемся в чужом коде, становится намного легче и понятнее. А когда такой причины нет, а ее ведь не будет не только в List'е или HashTable, но и в ненужных фабриках, цепочках делегатов и еще в массе других вещей, которые можно использовать не по назначению - и такого к сожалению на практике много.

Поэтому я немного против того, чтобы на таких примерах, как этот, у человека, который учится программировать, возникало ошибочное представление о перформансе, сфере применений хэш таблиц итд
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,086
Записей в блоге: 2
05.12.2019, 20:59
Ourn, не понял о чем вы.
Ответ на задачу в теме дан до четвертого поста.
Дальнейшее обсуждение по сути к задаче темы не относится.
Обсуждается что и где будет эффективнее использовать.
И совсем новичкам-новичкам это не нужно.
Им бы обычные массивы и списки освоить.
Нужно это тем кто продвинулся чуть дальше.
Я сам начинающий и для меня такое обсуждение полезно.
Возможно ТС тоже захочет кроме самого простого решения получить больше информации о возможных вариантах.

Добавлено через 7 минут
Ourn, и LinkedList ни как не может заменить List.
В нём нет индексатора.
А это очень важный и часто используемый способ работы со списком.
List более правильно называть не списком, а списочным массивом или массивом списочного типа.
0
68 / 38 / 11
Регистрация: 07.11.2019
Сообщений: 136
05.12.2019, 22:16
Цитата Сообщение от Элд Хасп Посмотреть сообщение
List более правильно называть не списком, а списочным массивом или массивом списочного типа.
Вы хорошо ориентируетесь в структурах данных? В частности в различии массива и списка?

List в C# - это враппер над одномерным массивом (вектором на уровне IL определений), называть его списочным массивом или массивом списочного типа неправильно. Это обычный массив, элементы которого размещены в памяти подряд и доступны с помощью перемещения указателей на заданное число байт в режиме unsafe. Так работает индексатор. Когда ему нужно достать элемент с индексом i, он обращается к ссылке на нулевой элемент в памяти и прибавляет к нему i*колво_байт_типа_элементов_массива.

LinkedList в С# - реализует двухсвязный список из элементов LinkedListNode<T> с круговым замыканием на уровне вершины head. Это реальный список, который хранит в себе, как поле данных, так и поля, содержащие ссылки на предыщие, следующие элементы. Что дает структура данных список? В первую очередь скорость добавления, вставки, удаления элементов, отдельных видов сортировки.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
В нём нет индексатора.
А это очень важный и часто используемый способ работы со списком.
Так вот индексатор не имеет никакого отношения к списку. Почему появился класс с названием List, какие проблемы с приведениями типов решали - это отдельная история, но List не имеет отношения к списку.

И я как раз писал о том, что даже там, где LinkedList может выглядеть предпочтительнее, в основном привыкли использовать обычный массив List. Потому что разница в перформансе незначительная.
И когда есть задача на хэш-таблицы - хорошо, когда она реальная, а не выдуманная из гипотетических соображений, как можно улучшить свитч из трех элементов.

PS надеюсь, никого не обидел, это из благих побуждений.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,086
Записей в блоге: 2
05.12.2019, 22:26
Ourn, я всё это знаю.
List во всех учебниках, документациях называют списком.
И этот не изменишь!
Просто массивом его никак не назовёшь независимо от того что там под оболочкой.
И сути это не меняет.
Изменится реализация под оболочкой - надо будет менять название типа?
Главное он представляет методы которые ожидаются от списка List.
От обычных последовательных списков его отличает возможность получения элементов по индексу.
Поэтому, и предлагаю как-то в названии связать список и массив.

Добавлено через 3 минуты
В остальном, да вы правы.
Для понимания начинающим нужны не выдуманные примеры, а близкие к реальности.
Но в данном обсуждении участвовали те ценнику достаточно объяснения в каких ситуациях следует какой тип использовать.
Если бы TC стал уточнять, то ему бы объяснили.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.12.2019, 22:26
Помогаю со студенческими работами здесь

Ошибки при работе с ComboBox (Case without Select Case)
подскажите пожалуйста в чем ошибка. Я начинающий, поэтому не относитесь строго к моей писанине. По одной Case работает отлично, но когда...

Как оформить условие на попадание в диапазон в конструкции Select Case ... End Select?
Народ, подскажите please, правильна ли конструкция следующего кода: Sub пример() pp2 = Str(InputBox(&quot;введите число&quot;)) ...

Структура ветвления выбор - иначе
Помогите написать программу: Введите три числа и выведите их в сточку в центре экрана: самое большое число красным цветом, самое...

Структура ветвления, периодическая функция
Помогите пожалуйста (или дайте ссылку на соответствующую литературу по теме) Периодическая функция f(x) определена на всей числовой...

Программа на с++. Структура ветвления выбор- иначе
Помогите пожалуйста с программой... Не знаю как оформить саму программу. С помощью условий знаю как сделать, а с помощью операторов ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru