Конференція Highload fwdays'19 — Autoscale, MySQL 8.0, Neo4j, Kafka and AWS Lambda | 05.10 | Київ

Поиск компонента в массиве на С#

Ситуация следующая. Есть большой список компонентов в массиве. У всех компоненты идут в конце с буквой B (80865B) но у нескольких все таки есть M(54565M).

Нужно:
во время цикла перебора массива с помощью проверки if проверить есть ли в этом компоненте массива B или M и принимать соответсвующие действия. Массив класса string. Что то вроде этого получается но не выходит)))

if (array[i].Equals("B"))

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Насколько «большой» список? Если это задача реальная, не часто исполняемая (нет сотни запросов в секунду), список на пару дестяков тыщ строк — то банально пройди это 60 килобайт прямым перебором, вот тебе и счастье.

Если же задача учебная, тебе надо выпендриться, или же реальная задача класса HighLoad — то тебе надо таки понимать ЧТО ты ищешь и в чём. То есть чётко знать форматы данных.

Например, если у тебя все строки гарантированно 6-симольные, и ты ищешь заданный символ точно в 5-й позикии то
1) Разберись с исходником класса String, как добраться к массиву с наименьшим вызовом функций и преобразованиями.
1а) В боевых задачах гарантии что там окажется строка тебе никто не даст. Равно как и то, что там будет 5-й символ. Ловить экспешены — плохой метод, надо проверять и фильтровать входные данные, если ты не контролировал их ранее.
2) Разберись, можно ли накинуть битовую маску. Битовая операция — самая быстрая. Например, ’M’ ^ ’M’ будет 0, а ’M’ ^ ’что-угодно’ - будет НЕ ноль.
2а) Почему не обычным == проверять? Можно.
Но когда тебе надо проверить вхождение сразу в нескольких позициях, будет ускорение: ты потом побитово перемножишь всю строку, и если хоть где-то был 0 — получишь ноль на выходе. Соответственно, чем длиннее исходный фильтр, чем более изощрённое условие на входе — тем выше выгода от битовых операций.

Но я повторюсь: это либо на highload, либо выпендриться. Реальных таких задач очень и очень немного. Менее одной десятитысячной процента. А вот во всех остальных гораздо важнее понятный код. Ибо купить вычислительный ресурс можно недорого, а вот окупить простой из-за тяжело пишущегося кода, вечные баги из-за сложно обнаруживаемых ошибок, и конечно расплату когда кто-то найдёт в твоём коде лазейку безопасности — можно далеко не во всяком коде.

Впрочем, если ты кодишь систему управления железной дорогой Москва — Ростов, то как раз так и надо писать :)

Спасибо за столько мудрый совет

А ещё можно сплитнуть коллекцию по условию и каждую подколлекцию обработать уже без if.

Дурацкий вопрос: вот эти В и М (char) — их случайно нельзя хранить отдельно от циферок перед ними (integer)?

Это парсер, он приори скачивает с сайта такие данные...че парится когда можно все перефоматировать за 10 строк кода

ну так че парится если можно вручную просмотреть все сайты и не парсить вообще??

По делу. Если парсить изначально в более удобном формате для обработки — можно добится неплохого улучшения в плане производительности.
Если вы знаете, что вам эти данные нужны будут для фильтрации выборки — почему сразу их не разложить удобно?

В ручную ты 1000 страниц не просмотришь за 20 минут))) Сразу они удобно разложены в массивы, позже перепишу на колекции...сейчас только тестирую.

Это парсер, он приори скачивает с сайта такие данные...че парится когда можно все перефоматировать за 10 строк кода

Вообще-то логично делать наоборот. Если ты заранее знаешь, что данные нужно будет определенным образом готовить, то логично это делать на лету — при парсинге. Потому что в работе парсера основной таймкиллер — сетевые операции, и малюсенькую пост-обработку данных ты даже не заметишь (за то время пока качается одна страничка с удаленного сервака можно разобрать на запчасти много-много тысяч подобных строк). А если их обрабатывать по факту, в уже собранном сыром массиве, то может получиться весьма затратно по времени если собранных данных действительно много (а если задача поиска по собранному систематическая, то тут вообще без вариантов — надо складывать в базу в «подготовленном» формате, позволяющем правильно их проиндексировать)...

if (array[i].Contains("B")) ...
if (array[i].EndsWith("B"))...
if (array[i].IndexOf("B")>=0)...
if (array[i][array[i].Length-1]==’B’)...

Спасибо за ответ. Четко и по делу. Сработало!

Нужно не строки сравнивать, а искать подстроку.

Подписаться на комментарии