Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как будет / 19 сообщений из 19, страница 1 из 1
07.11.2019, 18:33
    #39886422
Vova_1805
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
C#, sTUDUIO'2019

char c;
c = (char)Console.Read();
как заменить более пофессионально нижнюю проверку

if (c != 'q' && c != 'Q')
Спасибо
...
Рейтинг: 0 / 0
07.11.2019, 19:03
    #39886457
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
Vova_1805,

tolower(), например...
...
Рейтинг: 0 / 0
07.11.2019, 19:11
    #39886461
Vova_1805
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
ёёёёё , Сасибо
до Вашей подсказки я проверил
if (Char.ToUpper(c) !='Q') - работает.
Мне кажется, что в C++
после введенной точки

c.
появлялись функции, а в C# - НЕ ТАК.
...
Рейтинг: 0 / 0
07.11.2019, 20:15
    #39886480
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
Vova_1805
как заменить более пофессионально нижнюю проверку

if (c != 'q' && c != 'Q')
Спасибо

Это самая быстрая проверка, можешь заменить на покрасивее, но будет тормознее.

PS Форум по C# тут

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
08.11.2019, 20:44
    #39886946
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
Согласно рекомендациям Микрософт сравнения с использованием ToUpper() происходят быстрее.
Внутри сравниваются строки в верхнем регистре и если перед этим строки были приведены в нижний регистр, то внутри сравнения их опять преобразуют в верхний.
...
Рейтинг: 0 / 0
08.11.2019, 21:21
    #39886957
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
Cat2,

внутри чего?
...
Рейтинг: 0 / 0
08.11.2019, 21:59
    #39886962
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
ёёёёё,

такая рекомендация действительно есть
https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings Use the String.ToUpperInvariant method instead of the String.ToLowerInvariant method when you normalize strings for comparison.
но в чем суть, я так и не понял... ниже есть такое
там жеTherefore, the following comparison:
String.Compare(strA, strB, StringComparison.OrdinalIgnoreCase);
is equivalent to (but faster than) this comparison:
String.Compare(strA.ToUpperInvariant(), strB.ToUpperInvariant(), StringComparison.Ordinal);
These comparisons are still very fast.
и такое
там жеThe String.ToUpperInvariant and String.ToLowerInvariant methods are also available. ToUpperInvariant is the standard way to normalize case. Comparisons made using StringComparison.OrdinalIgnoreCase are behaviorally the composition of two calls: calling ToUpperInvariant on both string arguments, and doing a comparison using StringComparison.Ordinal.
но рекомендацию использовать ToUpper вместо ToLower ничего из этого вроде как не объясняет...

P.S. в исходниках сравнение строк упирается в native API call - InternalCompareString - может там собака зарыта?
...
Рейтинг: 0 / 0
08.11.2019, 22:28
    #39886967
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
Задача не имеет смысла, потому что теоретически может быть какая-то локаль в которой c != 'q' && c != 'Q' может означать что угодно. Например, в турецкой локали есть известная шляпа:
Код: c#
1.
2.
3.
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("tr-TR");
Console.WriteLine("i".ToUpper() == "I"); // false
Console.WriteLine("I".ToLower() == "i"); // false
...
Рейтинг: 0 / 0
09.11.2019, 00:23
    #39886976
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
fkthat,

мокрософты рекомендуют - ToUpperInvariant/ToLowerInvariant
...
Рейтинг: 0 / 0
09.11.2019, 00:28
    #39886978
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
Код: c#
1.
string.Equals('q'.ToString(), 'Q'.ToString(), StringComparison.CurrentCultureIgnoreCase)
...
Рейтинг: 0 / 0
09.11.2019, 00:53
    #39886980
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
Shocker.Pro,

с турецкой локалью, согласно fkthat, имеем
Код: c#
1.
2.
            System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("tr-TR");
            System.Diagnostics.Debug.WriteLine(string.Equals('i'.ToString(), 'I'.ToString(), StringComparison.CurrentCultureIgnoreCase)); // false
...
Рейтинг: 0 / 0
09.11.2019, 01:02
    #39886981
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
Можешь поставить инвариантную культуру, всё в твоих руках.
Не понимаю, зачем нужно преобразовывать сравниваемые строки, когда есть штатные инструменты для их сравнения нужным способом (а также штатные компараторы (для Linq, к примеру))

А что касается турецкого примера - так ты турецкую раскладку на клаве сначала поставь и сравнивай ввод из консоли.
У автора-то именно консоль
...
Рейтинг: 0 / 0
09.11.2019, 05:17
    #39886993
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
Shocker.Pro,

FxCop, кстати, сразу же предупреждает о подобных преобразованиях.

...
Рейтинг: 0 / 0
09.11.2019, 11:28
    #39887013
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
решарпер тоже подчеркивает
...
Рейтинг: 0 / 0
09.11.2019, 11:58
    #39887015
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
...
Рейтинг: 0 / 0
09.11.2019, 12:28
    #39887018
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
што это тут происходит?
...
Рейтинг: 0 / 0
09.11.2019, 12:45
    #39887023
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
В Турцию собираемся
...
Рейтинг: 0 / 0
09.11.2019, 13:07
    #39887025
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет

Не бывает универсального "correctly", я о том и говорю, все зависит от конкретной ситуации. В одной ToUpper будет одним, в другой ToUpper будет другим, ToUpperInvariant всегда будет одним и тем же, но, возможно, по конкретной задаче нужно приведение по какой-то конкретной локали, а не по инвариантной. FxCop и Resharper прямо так и говорят - "хочешь делать что-то локалезависимое - указывай явно локаль".
...
Рейтинг: 0 / 0
09.11.2019, 19:53
    #39887112
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как будет
fkthat,
Понятно, спасибо.

Cat2,
Согласно рекомендациям Микрософт сравнения с использованием ToUpper() происходят быстрее немножко правильнее :)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как будет / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]