[Useful Info] whitespace - какво представлява; сплитване по whitespace в изпитните задачи
Здравейте, колеги,
поради зачестилото използване на понятието whitespace в изпитните задачи по Programming Basics, и недоразуменията по въпроса как точно трябва да се разбира това понятие, искам да посоча малко справочна информация по въпроса:
Първо MSDN: C# Language Specification 2. Lexical structure 2.3 Lexical analysis 2.3.2 White space
"White space is defined as any character with Unicode class Zs (which includes the space character) as well as the horizontal tab character, the vertical tab character, and the form feed character. " - общо 20 различни символа.
Въпрос: Whitespace означава ли ' ' (т.е. space)?
Отговор: Не: space е whitespace, но whitespace не е space. Освен space ' ', whitespace включва още 19 различни символа, 16 от които са други видове space:
http://www.fileformat.info/info/unicode/category/Zs/list.htm
плюс още tab '\t', new line '\n' (само за Windows users), form feed '\f'.
Въпрос: Ако сплитваме string по space (' '), това значи ли, че го спливаме по whitespace?
Отговор: Не. Означава че сплитваме само по един от 20-те вида whitespace characters. В част от тестовете в judge това ще мине;
или, в частен случай, ако в условието на задачата пише whitespace, но в тестовете в judge е включен от всичките 20 вида separators само space ' ', то тогава такова спливане по space, по изключение, ще мине.
Въпрос: Можем ли да опитаме да налучкаме какви whitespace characters има в тестовете в judge?
Отговор: Може да мине, това например минава на задачата 04. Olympics Are Coming от Advanced C# Exam 31 May 2015, защото по логика няма вероятност някой да си е играл да сложи повече от 2-3 вида whitespace characters в тестовете в judge.
line[0].Split(new[] {' ', '\n', '\t'}, StringSplitOptions.RemoveEmptyEntries);
но има по-лесни начини - съществуват решения, които са по-прости и по-универсални, ето две:
1.
line[0].Split(new char[0], StringSplitOptions.RemoveEmptyEntries); това не налучква използваните whitespaces, а ги замества всичките:
"If the separator parameter is null
or contains no characters, white-space characters are assumed to be the delimiters."
Справка тука: http://stackoverflow.com/questions/6111298/best-way-to-specify-whitespace-in-a-string-split-operation
2. "Of course, if you don't like using options, just use the regex alternative"
Regex.Split(line[0], @"\s+");
Това му е хубавото на програмирането, че винаги съществува повече от едно решение.
Поздрави,
Катя
Здравей, Павел,
да, прав си - има вариант за отстраняване на empty entries и с regex, ето един:
string[] nameInput = Regex.Split(line[0], @"\s+").Where(s => s != string.Empty).ToArray();
ако е само в началото или края - може също:
string[] nameInput = Regex.Split(line[1], @"\s+");
var name = string.Join(" ", nameInput).Trim();
но няма как да си сигурен, че само в началото и края ще имаш empty entries, така че първият вариант си е по-добър.
Regex.Split(line[0].Trim(), @"\s+");
Тъкмо четох за Regex.Replace , а то Trim() го прави доста по-елегантно. Благодаря Ви!