2009-02-02 4 views
0

Предположим, моя программа всегда передается строка символов, которая представляет таблицу данных в синтаксисе Wiki. Что-то вроде:Какую структуру данных OO следует использовать для этих строковых данных?

{||Client:||ABC|-|Contact:||Joe Smith|-|Current revision:||1.0||} 

Я не хочу, чтобы каждый из моих объектов конкретных Wiki таблицы (например, ClientContactTable, CustomerOrderTable и т.д.), чтобы знать, как разобрать | и и }. Поэтому я хотел бы написать 1 кусок кода, который анализирует строку в некоторый объект данных среднего уровня, который я могу передать конструктору каждого конкретного объекта таблицы Wiki.

Мой вопрос: Какой должен быть объект среднего уровня?

+0

Dupe of http://stackoverflow.com/questions/504780/how-type-of-oo-data-structure-should-i-use-for-this-string-data – gregmac

+0

Оставим это открытым, так как оно имеет ответы, а другой нет. –

ответ

3

Вы хотите реализовать System.Runtime.IFormatter, чтобы создать общий WikiTable сериализации форматировщик. Чтобы помочь вам в этом, вы можете наследовать базовый класс System.Runtime.Formatter.

После того, как вы сделали это, вы бы использовать его как это:

Stream msg = GetWikiClientContactTableMessage(); 
WikiTableFormatter wtf = new WikiTableFormatter(); // nice name ;) 
ClientContactTable result = (ClientContactTable)wtf.Deserialize(msg); 

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

+0

+1 также для wtf как имя переменной. Хороший Джоэл :) –

0

Я бы пошел с картой от строк до строк.

Это не особенно OO, но он выполнит эту работу, если только что-то о работе, о которой я не знаю.

0

Я бы использовал таблицу Dictionary или Hash.

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

В случае документы MSDN трудно читать (всегда были для меня), я дам краткий обзор. В принципе, словарь принимает объект (строку?) В качестве ключа и другой объект для данных.

Dictionary<string,string> d = new Dictionary<string,string>(); 
d["key1"] = "value"; 
d["anotherkey"] = "anothervalue"; 
0

Как уже говорилось, если вы хотите, чтобы первое имя выступало в качестве ключа, используйте ассоциативную карту (string-> string). Это должно быть самым чистым способом; это означает, что ваш код синтаксического анализа может включать в себя много проверок ввода и обработки ошибок, которые в противном случае были бы дублированы для каждого класса объектов.

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

Смежные вопросы