Функция длинной подстроки С#

У меня есть строка, которая "может" быть длиннее любых простых границ int.

В настоящее время функция string.substring принимает только параметры int в качестве индекса и длины, чего мне недостаточно, так как мне нужно long для типов значений параметров.

Знаете ли вы какую-либо реализацию функции длинной подстроки?

Или что вы порекомендуете мне сделать, чтобы решить эту возможную проблему поиска подстроки с очень длинной строкой?

Спасибо.


person Gloomdo    schedule 12.03.2011    source источник
comment
Строка такой длины (символы ›2G) займет ›4 ГБ памяти. Вы уверены, что функция подстроки будет вашей единственной проблемой?   -  person Jon    schedule 12.03.2011
comment
Какова длина строки? А как же подстрока? Вы, вероятно, не хотите сразу загружать всю строку в память, а использовать файловый поток для чтения частей файла при поиске подстроки?   -  person Klaus Byskov Pedersen    schedule 12.03.2011
comment
Возможный процесс сопоставления строк, вероятно, будет происходить только в памяти, а объем доступной памяти для машины предположительно очень велик. Строки, над которыми будет работать эта операция, это: вся строка составляет около 10 ГБ символов, а подстрока - 1000 символов или около того. Я согласен с тем, что любая операция сопоставления строк с такими большими строками будет алгоритмически идиотской в ​​дополнение к требованиям к ресурсам.   -  person Gloomdo    schedule 12.03.2011


Ответы (4)


У меня есть строка, которая "может" быть длиннее любых простых границ int.

Нет, в .NET такой проблемы не будет. Сам класс System.String везде использует индексацию Int32 и свойства Length.

Возможно, у вас будет массив (char) размером более 2 ГБ, но об этом позаботятся, вы можете использовать «длинную» индексацию.

Связанный вопрос: Какова максимально возможная длина строки .NET?

person Henk Holterman    schedule 12.03.2011
comment
Мне нравится комментарий Это одна из тех ситуаций, когда если вам нужно спросить, вы, вероятно, делаете что-то не так. - person Gloomdo; 12.03.2011
comment
даже не массивы... См. здесь: stackoverflow.com/questions/573692/ и stackoverflow.com/questions/1087982/ - person xanatos; 12.03.2011
comment
@xanatos: Вы правы, я думал об этом свойстве LongLength, но это не индексация. - person Henk Holterman; 12.03.2011

Как указано в ответе по ссылке, которую предоставляет Хенк, вы не можете создать объект размером более 2 ГБ в .NET (64-разрядная версия также имеет это ограничение).

Поэтому у вас не может быть такой большой строки, несмотря ни на что. Вам нужно будет использовать какой-то алгоритм потоковой передачи, чтобы найти и изолировать интересующие вас данные.

person Jon    schedule 12.03.2011

Как сказал Хенк Холтерман, System.String использует int32....

Но если нужно, используйте unsigned int, число которых может достигать 4 300 000 000: попробуйте uint.

uint stringLength =  4,294,967,295

хотя он не намного выше, чем обычный int

int -> -2 147 483 648 до 2 147 483 647 uint -> 0 до 4 294 967 295

person Reza M.    schedule 12.03.2011

Кроме того, обычные алгоритмы работы с подстроками могут не работать в таком масштабе (на самом деле я не знаю, как работает .Substring). Вы можете взглянуть на это.

person SWeko    schedule 12.03.2011