Что является лучшей альтернативой следующей структуре данных: Dictionary <string, Dictionary <string, string >> - PullRequest
1 голос
/ 16 июня 2009

У меня есть следующий набор данных

<ids>
   <id1 attr1="value1" attr2="value2" />
   <id2 attr3="value3" attr4="value4" />
   <id3 attr2="value6" attr5="value7" />
</ids>

По сути, это XML, который может иметь любое имя узла с любым именем атрибута с любым значением атрибута.

После анализа XML я сохраняю данные атрибутов в словаре. Затем я сохраняю тот же словарь в качестве значения с именем узла в качестве ключа. Таким образом, моей структурой данных будет Dictionary > (давайте присвоим этому имени переменную с именем «dict») Поэтому, если бы я хотел получить значение для attr2 в узле id1, я бы сделал:

string value = dict["id1"]["attr2"];
// value will be value2

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

Ответы [ 8 ]

5 голосов
/ 16 июня 2009

Я думаю, что ваше решение хорошее. Он обеспечит очень быстрый поиск и точно соответствует вашему домену.

Ваша основная проблема с вложенными словарями? Если это так, я бы посоветовал вам не беспокоиться об этом - использование коллекций коллекций часто является очень полезным инструментом.

Моя единственная жалоба заключается в следующем: если вы не используете это часто, вы собираетесь загружать много информации в структуру данных, которая может быть ненужной. Если это одноразовый поиск, то оставить его в XML и использовать запросы XPath может быть более оптимальным решением, чем предварительный анализ и загрузка всего объекта в память. Однако, если вы часто спрашиваете об этом, это более оптимальное решение.

3 голосов
/ 16 июня 2009

Как насчет класса?

public class YourId
{
    public string Id { get; set; }
    public string Attribute1 { get; set; }
    public string Value { get; set; }
}

Тогда вы можете создать список и заполнить его через ваш XML ... С ним было бы легко работать, и вы могли бы использовать с ним linq:

List<YourId> items = GetIdsFromXml();

var query = from i in items
            where i.Id == "id1"
            select i;

// or...

items.Where(i => i.Attribute == "blah").ToList();

// ect.
2 голосов
/ 16 июня 2009

Просто ради ухмылки - что если вы сохранили XML DOM и нашли свои атрибуты с помощью запросов XPath? Таким образом, если бы у вас были повторяющиеся имена узлов, вы могли бы учесть это.

2 голосов
/ 16 июня 2009

Этот XML выглядит не очень хорошо. Это не семантический XML вообще. Семантический XML будет:

<data>
    <item id="id1">
        <value name="attr1">value1</value>
        <!-- ... -->
    </item>
    <!-- ... -->
</data>

Я знаю, что это больше, но это XML для вас. Причина, по которой я даже говорю, заключается в том, что если вы не готовы использовать семантический XML, вы, вероятно, ищете другой формат данных. XML немного раздут от природы. Если вы ищете компактный формат, взгляните на JSON .

В любом случае, используя семантический XML, я бы порекомендовал XPath. Просмотрите документацию MSDN и посмотрите на методы SelectNodes в объектах DOM.

Краткий пример:

XmlDocument doc = new XmlDocument();
doc.Load("data.xml");

// Get a single item.
XmlNode item = doc.SelectSingleNode("//item[@id=myid]");
1 голос
/ 16 июня 2009

Пока все узлы имеют уникальные имена, вы должны быть в порядке. Обратите внимание, что для XML это не будет работать так:

<nodes>
     <node id="id1" attr1="value1" attr2="value2" />
     <node id="id2" attr3="value3" attr4="value4" />
     <node id="id3" attr2="value6" attr5="value7" />
</nodes>
0 голосов
/ 16 июня 2009

Если вам нужна грамматика XML, создайте ее для своих нужд. Если вам нужен синтаксический анализатор, используйте один из множества превосходных, представленных в библиотеке .Net. Если вам нужно сохранить документ в памяти и получить к нему доступ, используйте DOM и XPath для выбора узлов. Если вам это не нужно, я бы рекомендовал не использовать XML, а вместо этого использовать что-то более простое, например JSON.

Если вам нужно сохранить все это в памяти, но только значения, тогда я предлагаю использовать DataSets и загрузить их с загрузчиками XML.

0 голосов
/ 16 июня 2009

Почему бы не использовать то, что уже существует? Как Простой анализатор XML в C #

0 голосов
/ 16 июня 2009

Учитывая, что XML может иметь любое имя узла и любое имя атрибута, я думаю, что ваше текущее решение оптимально.

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