Loading...
tanchev avatar tanchev 2 Точки

String Split Options и защо не работи?

Здравейте,

Някой може ли да ми обясни, защо в този случай https://pastebin.com/CXXVaZw5 string split options не работи, нещо не мога да разбера от документацията ли, според мен би трябвало да работи перфектно.

Включително не ми работеше и .RemoveAll https://pastebin.com/xGH5JS61 ето тук може да се види.

Става въпрос за задача от Fundamentals Exercise

7.    Append Arrays.

https://softuni.bg/trainings/resources/officedocument/46607/exercise-problem-descriptions-csharp-fundamentals-january-2020/2600

Моля ако може някой по-напреднал от Advanced или още по-напред да ми обясни, защото имам чувството, че тази задача може да се реши много по-лесно без да се налага да използват два вложени for цикъла като тук - https://pastebin.com/i1k14ygv или един като тук - https://pastebin.com/k4nS3eJt.

Някакви идеи?

 

Благодаря Ви,

 

Поздрави,

Тагове:
0
Module: C# Advanced
kkaraivanov avatar kkaraivanov 486 Точки
Best Answer

Здравей колега. Декларирай променливата ето така

List<string> numbers = Console.ReadLine()
                .Split(new char[] { '|', ' ' }, StringSplitOptions.RemoveEmptyEntries)
                .Reverse()
                .ToList();

мисля че ще си доволен :), а този код -  numbers.RemoveAll(x => string.IsNullOrEmpty(x));  ще бъде валиден ако го промениш ето така:

numbers = numbers.Where(x => x != string.Empty).ToList();

но ако ползваш предложението ми за деклариране на numbers, втория код за отстраняване на празните полета няма да ти трябва. Според мен си направил супер решения на задачата. Ако ти е необходимо обяснение ето ти един пример, който мисля че ще ти бутне едно рамо -

char[] param = new char[] { '|', ',', ' ', '=', '.', '+', '*' };
List<string> numbers = Console.ReadLine()
                .Split(param, StringSplitOptions.RemoveEmptyEntries)
                .Reverse()
                .ToList();

Всеки знак в масива ще ти раздели стринга когато го срещне, а ако искаш да си "хакнеш" дълъг стринг и да го разделиш например на [търсена дума] [останала част от стринга] по някакъв сепаратор - в случая '|', можеш да го направиш ето така -

List<string> numbers = Console.ReadLine()
                .Split('|', 2)
                .Reverse()
                .ToList();

Пробвай и ще видиш какво ще се получи :)

0
19/02/2020 18:09:08
tanchev avatar tanchev 2 Точки

Здравей,

Супер, благодаря ти за идеята. Проблема е, че аз просто питах, защо не работи метода, иначе идеята ти е супер, проблема е, че обръща целия лист, а в задачата листа трябва да си върви отзад-напред, започвайки от лявото число към дясното, както и да е...

Още нещо този код 

numbers = numbers.Where(x => x != string.Empty).ToList();

тествах го и все още не маха многото празни пространства, които има между числата, което също не би трябвало да се случва имайки предвид филтрацията.

А това new char[] нов масив ли прави въре в сплита?

Благодаря,

 

0
kkaraivanov avatar kkaraivanov 486 Точки

new char[]  ти позволява да декларираш няколко символа за филтър, т.е. Да прави нов масив със символите. Кодът

numbers = numbers.Where(x => x != string.Empty).ToList();

няма да ти махне празните символи. Това което преви този код е, ако в масива се нестне празен стринг, метода ще ти го премахне от масива. Постнах го защото ти се опитваше да премахнеш всички индекси които са с празен индекс и понеже методът RemoveAll  използван с предикат ще ти върне стойност, то така написан няма да направи нищо. Кодът

List<string> numbers = Console.ReadLine()
                .Split(new char[] { '|', ' ' }, StringSplitOptions.RemoveEmptyEntries)
                .Reverse()
                .ToList();

ще ти сплитне стринга и в листа ще ти останат само стойностите, което мислех че целиш да постигнеш.. Ако неискаш да се обръща реда, просто премахни

.Reverse()

от декларацията и всичко ще е Ок.

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