C #: Какой лучший класс коллекции для хранения очень похожих строковых элементов для эффективной сериализации в файл - PullRequest
3 голосов
/ 24 марта 2010

Я хотел бы сохранить список entityID электронных писем outlook в файл. EntityID - это строки типа:

"000000005F776F08B736B442BCF7B6A7060B509A64002000" "000000005F776F08B736B442BCF7B6A7060B509A84002000" "000000005F776F08B736B442BCF7B6A7060B509AA4002000"

Как вы можете заметить, строки очень похожи. Я хотел бы сохранить эти строки в классе коллекции, который будет храниться максимально эффективно, когда я сериализую его в файл. Знаете ли вы какой-либо класс коллекции, который может быть использован для этого?

Заранее спасибо за любую информацию ... Грегор

Ответы [ 3 ]

8 голосов
/ 24 марта 2010

Никакой ранее существующий класс коллекции в платформе не подойдет вашим потребностям, потому что они являются общими: по определению они ничего не знают о типе, который они хранят (например, string), поэтому они ничего не могут с ним сделать.

Если эффективная сериализация - ваша единственная задача, я предлагаю вам просто сжать сериализованный файл. Подобные данные - праздник алгоритмов сжатия. .NET предлагает алгоритмы gzip и deflate в System.IO.Compression; лучшие алгоритмы (если они вам нужны) можно легко найти через Google.

Если эффективность в памяти также является проблемой, вы можете хранить свои строки в trie или radix tree .

4 голосов
/ 24 марта 2010

Возможно, вы захотите взглянуть на структуру данных Radix Trie , так как это позволит эффективно хранить ваши ключи.

Что касается сериализации в файл, выможет, возможно, пройтись по дереву и записать каждый узел.(В следующем примере я использовал отступ для обозначения уровня в дереве, но вы могли бы придумать что-то более эффективное, например, использовать управляющие символы для обозначения спуска или подъема.)

00000000
  5F776F08B736B442BCF7B6A7060B509A
    64002000
    84002000
    A4002000
  6F776F08B736B442BCF7B6A7060B509A
    32100000

Пример выше представляет собой набор:

000000005F776F08B736B442BCF7B6A7060B509A64002000
000000005F776F08B736B442BCF7B6A7060B509A<b>84002000</b>
000000005F776F08B736B442BCF7B6A7060B509A<b>A4002000</b>
00000000<b>6F776F08B736B442BCF7B6A7060B509A32100000</b>
0 голосов
/ 24 марта 2010

Почему проблема эффективна? Вы хотите использовать как можно меньше HD-пространства (HD-пространство дешево). В C # существует 2 наиболее часто используемых сериализатора: Binary или XML

Если вы хотите, чтобы пользователь позволял настраивать файл, например, с помощью блокнота -> используйте xml. Если не использовать двоичный файл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...