Loading...
Iv_Konov avatar Iv_Konov 383 Точки

C# - Защо Съдията не харесва .Contains() при работа със стрингове - Emoji Sumator, Regex

Здравейте, колеги,

 

Имате ли идея защо Съдията не харесва .Contains() при работа със стрингове? Или къде греша при ползването?!?

 

Гледам, че String.Contains го има и в .NET Framework също, но не виждам друга причина освен подобен проблем с инсталацията на Съдията... VS 2017 ми работи коректно с този метод, или поне не намерих вход, с който да счупя разпознаването...


При дадената задача реших да проверя дали даден стринг примерно:
seven 
се съдържа в стрингова колекция примерно:
:england: :done: :seven: :hamster:

 

Тази идея ми дойде за решение, но Съдията дава грешка 90/100:
(разбира се, време ми отне, за да отгрия, че точно това не се харесва)

            if (string.Join("", matchCollection).Contains(emojiName))
            {
                totalPower *= 2;
            }


Реших задачата по алтернативен начин - 100/100:

            foreach (var match in matchCollection)
            {
                string tempMatch = match.ToString();
                string tempEmojiName = tempMatch.Remove(0, 1);
                tempEmojiName = tempEmojiName.Remove(tempEmojiName.Length - 1, 1);

                if (tempEmojiName == emojiName)
                {
                    totalPower *= 2;
                    break;
                }
            }

 

Мой код - линк.
Съдия - линк.
Условие на задачата - линк.

 

Поздрави,
Иван
 

Тагове:
0
Fundamentals Module
VasilKotsev avatar VasilKotsev 830 Точки
Best Answer

Проблема е, че конкатенираш съвпаденията (както са match-нати в регулярния израз със ':' в двата края) и после ги сравняваш без ':' в началото и края на даденото име при входа. При начина, който си я решил със 100 т., премахваш на всяка итерация символите в крайщата на низа (избягвай такива операции...) и после го сравняваш.

Няма как е да е проблем със Judge, единствената стратегия е Core и предполагам са я ъпдейтнали до 2.2, преди месеци съм проверявал и със сигурност беше 2.1. Така, че не става на въпрос за разлика в оврълоуди на методи при стария фреймуорк. Visual Studio-то също не е фактор, от значение е SDK-то, а не средата за разработка. Според мен проблема е в теста, явно автора е искал да се сетите за някакъв граничен случай или е сбъркан.

По-удачно ще е да си провериш със .Any() LINQ extension метода върху IEnumerable<Match> и да провериш дали Match.Value съвпада. Имай предвид, че string.Contains() по-дефоулт сравнява case-sensitive и culture-insensitive.

Ето поправен код с първото ти решение.

0
21/07/2019 22:29:59
Iv_Konov avatar Iv_Konov 383 Точки

Здравей,

 

Благодаря, поучителни са ти съветите!  Разибира се, и решението ти е добро.

 

Не разбирам съвсем - има ли последствия при употребата на string.Contains()  предвид, че е culture-insensitive? Ясно е, че точка, запетая и др. се различават в различните регионални настройки, но не разбирам как точно рефлектира при сравняването...

 

Допълнително, до колкото разбирам, няма чист/лесен вариант /без изрязване или добавяне на символи/ за стравняване/търсене на стрингове с други стригове? За char да се тъсят в стрингове има решения, но за да реша задачата по трудния и непрепоръчителен начин си беше по принуда... просто не знам как иначе. wink

 

Поздрави,

Иван 

0
VasilKotsev avatar VasilKotsev 830 Точки

string.Contains() е начина за търсене на substring-ове в други низове. И аз не успях да счупя входа (а и не си играх много), но без да видя теста не мога със сигурност да кажа какъв е проблема. Най-вероятно е нещо тъпо, но... Относно сравнението на низове в .Contains(), ще има значение ако очакват да ги сравняваш case-insensitive, което е малко вероятно според мен. Culture-а не би трябвало да играе фактор тук.

Лошото в твоя подход е, че правиш string.Join() върху колекция от Match-ове, вместо да провериш дали има елемент в нея, който да съвпада с входа, а не самото сравнение на низове, въпреки че и това е валиден подход за задачата.

1
Iv_Konov avatar Iv_Konov 383 Точки

Добро утро,

 

Благодаря, обогати ме с идеи за работа, т.е. вече съм готов да архивирам случая.

 

Успешен ден,

Иван :)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.