Быстрый и эффективный для хранения данных класс ASCII для .NET.

Это может быть задано раньше, но я не могу найти таких сообщений. Есть ли класс для работы с ASCII-строками? Преимущества многочисленны:

  • Сравнение должно быть более быстрым с момента его просто байта для байта (вместо UTF-8 с переменной кодировкой)
  • Эффективная память, должна использовать примерно половину памяти в больших строках.
  • Более быстрые версии ToUpper()/ToLower(), которые используют Look-Up-Table, которая является языковым инвариантом

Jon Skeet написал базовую реализацию AsciiString и доказал # 2, но мне интересно, кто-то сделал это дальше и завершил такой класс. Я уверен, что будут использоваться, хотя никто не будет использовать такой маршрут, поскольку все существующие функции String должны быть повторно реализованы вручную. И конверсии между String < > AsciiString будут разбросаны повсюду, что усложняет простую программу.

Есть ли такой класс? Где?

Ответ 1

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

Строка ASCIIChar и строка ASCIIString неявно преобразуются в их собственные копии для удобства использования.

Предложение OP для замещения ToUpper/Lower и т.д. было реализовано гораздо быстрее, чем список поиска, и все операции такие же быстрые и удобные для памяти, как я мог их сделать.

Извините, не мог опубликовать источник, это было слишком долго. См. Ссылки ниже.

  • ASCIIChar - Заменяет char, сохраняет значение в байте вместо int и предоставляет методы поддержки и совместимость для строки класс. Реализует виртуальные все методы и свойства, доступные для char.

  • ASCIIChars - Предоставляет статические свойства для каждого из допустимых символов ASCII для удобства использования.

  • ASCIIString - Заменяет строку, сохраняет символы в массиве байтов и реализует практически все методы и свойства, доступные для строки.

Ответ 2

Dotnet не поддерживает прямую строку ASCII. Строки - это UTF16, потому что Windows API работает с ASCII (onr char - один байт) или только с UTF16. Utf8 будет лучшим решением (Java использует его), но .NET не поддерживает его, потому что Windows этого не делает.


Windows API может конвертировать между кодировками, но windows api работает только с 1 байт-символами или 2 байтовыми символами, поэтому, если вы используете строки UTF8 в .NET, вы должны преобразовывать их каждый раз, что влияет на производительность. Dotnet может использовать UTF8 и другие блокировки через BinaryWriter/BinaryReader или простой StreamWriter/StreamReader.