2014-09-24 3 views
0

Я пытаюсь понять, как написать функцию C#, которая возвращает true, если есть «соответствие» между двумя строками. Цифры в строке всегда будут отсортированы в порядке возрастания.C# Match CSV String

string1: 1,3 
string2: 1,2,3 

Функция должна возвращать значение true, если все числа в строке1 найдены в строке2. В приведенном выше примере возвращаемое значение должно быть истинным.

string1: 1,2,4 
string2: 1,2,3 

В приведенном выше примере return false должно быть ложным, поскольку не все числа в строке1 находятся в строке2.

Базовый корпус string1, являющийся пустой строкой, должен всегда возвращать true независимо от того, что содержит string2.

Я думаю о том, чтобы разделить обе строки на массивы и попытаться сделать совпадение, а также будет интересоваться опцией регулярного выражения. Откройте все идеи, которые у вас есть.

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

В большинстве строк в них будет 10 номеров, если это поможет. Мы никогда не увидим строку с сотнями чисел.

+1

homeework.stackexchange.com? – Noctis

+0

Итак, вы просите того, кто выполняет самые быстрые (я * люблю эту фразу), но вы можете написать свои собственные функции, и вы все равно будете их тестировать? Что именно вы ожидаете от нас? – Rawling

+0

«У строк в лучшем случае будет 10 чисел». Почему же вы беспокоитесь о производительности? – user2023861

ответ

6

Если формат является строгим, и вы не можете иметь что-то вроде 1, "1,2,3", 2 вы можете использовать String.Split и LINQ:

bool allInOneInTwo = !string1.Split(',').Except(string2.Split(',')).Any(); 

Enumerable.Except возвращает разность множеств двух последовательностей и является весьма эффективным. Потому что он выполнен лениво Enumerable.Any вернется в первом матче.

Поскольку вы упомянули, что оно должно быть эффективным, поскольку он выполняется до 100k раза в день, и что вы ожидаете, что она занимает меньше, чем на пару секунд максимума: с образцом выше занимает всего 140 миллисекунды чтобы выполнить его 100k раз на моем ПК. Но оба массива очень малы. Except будет иметь большее значение, если они будут больше.

+0

+1 Тим, Он выглядит элегантно. – user2711965

+0

FYI, string.Split() выводит подзаголовок и поэтому требует выделения памяти. Вы можете определенно сделать это без string.Split(), если ваша первая проблема - производительность. Код не будет таким читаемым, но это позволит избежать выделения памяти. Вы просто набираете каждый символ char-by-char, пока не найдете номер, который вы не ожидаете, или конец строки. – user2023861

+0

@ user2023861: во-первых, OP упомянул, что «у большинства было бы 10 чисел в них». Кроме того, в настоящее время не переоценивайте стоимость памяти. Обычно у вас более, чем достаточно, и, используя его, вы можете использовать приложения, созданные на основе набора параметров, как указано выше. –