Массив словаря в C # - возможно? - PullRequest
0 голосов
/ 20 октября 2010

Могу ли я использовать объекты массива словаря?

У меня есть XML, который я хотел бы изменить.Структура данных, которую я буду использовать, это -

Dictionary<element, Dictionary<attr, value>>

элемент - это Элемент, который я собираюсь изменить attr - атрибут, значение которого я собираюсь обновить, - значение, которым я являюсьдля обновления

<Parents>
    <Parent id="ParentA" description="New">
        <Children>
            <Child name="ChildA" />
        </Children>
    </Parent>
</Parents>

Я хотел бы передать следующее

Dictionary<string, string> dict_Attributes1=new Dictionary<string, string>();
Dictionary<string, string> dict_Attributes2=new Dictionary<string, string>();
dict_Attributes1.Add("id", "ParentB");
dict_Attributes1.Add("description", "Old");
dict_Attributes2.Add("name", "ChildB");
Dictionary<string, Dictionary<string, string>> dict_Elements = new Dictionary<string, Dictionary<string, string>>();
dict_Elements.Add(".", dict_Attributes1);//To update the Element
dict_Elements.Add("Children/Child", dict_Attributes2);//To update the Children's Attributes

Допустим, я уже определил, что должен обновить Parent, чей идентификатор - ParentA.

Теперь, когда я создаю dict_Attributes1, dict_Attributes2 и т. Д., Есть ли способ сохранить их в (динамическом, неизвестном во время компиляции) массиве объектов Dictionary?

В качестве альтернативыЕсть ли лучший способ сделать это - 1. Изменить атрибуты выбранного XElement и его дочерних атрибутов?

РЕДАКТИРОВАТЬ

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
    <Environments>
        <Environment id="Master" description="MasterSystem">
            <Systems>
                <DefaultSystem systemName="Master" server="http://localhost" />
            </Systems>
        </Environment>
    </Environments>
</Configuration>

Теперь, когдаПользователь меняет идентификатор и описание, я хочу обновить этот файл XML с новыми значениями.При изменении идентификатора и описания (которые получены от пользователя), я хочу обновить systemName с тем же значением идентификатора.

Если новый идентификатор «Разработка» и описание «DevelopmentSystem»,

Выходной XML должен быть

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
    <Environments>
        <Environment id="Development" description="DeveloperSystem">
            <Systems>
                <DefaultSystem systemName="Development" server="http://localhost" />
            </Systems>
        </Environment>
    </Environments>
</Configuration>

Ответы [ 5 ]

7 голосов
/ 20 октября 2010

Да, это возможно.Я не уверен, какой из них вам нужен, но они оба используют List<T>:

var list = new List<Dictionary<string, string>>();

или:

var list = new List<Dictionary<string, Dictionary<string, string>>>();
3 голосов
/ 20 октября 2010

Хотя то, что вы хотите сделать, допустимо, я бы лично использовал LINQ to XML .

Существует небольшая кривая обучения, но если вы хотя бы знакомы с LINQ и XML, это будет иметь смысл после того, как вы немного поиграете с ним.Он, вероятно, будет более эффективным, чем предлагаемые вами структуры, и, безусловно, будет легче адаптировать и поддерживать (вами или особенно кем-то еще), поскольку они являются стандартизированной технологией.

2 голосов
/ 20 октября 2010

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

var dictionaries = new List<Dictionary<string, string>>();

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

var dict = new Dictionary<string, string> { { "Key1", "Value1" }, };
dictionaries.Add(dict);

Что касается заданного вами конкретного вопроса:

Теперь, здесьЯ создаю dict_Attributes1, dict_Attributes2 и т. Д., Есть ли способ, которым я могу сохранить их в (динамическом, неизвестном во время компиляции) массиве объектов Dictionary?

Да, вы можете создать массив объектов словаря.Это не то же самое, что словарь словарей, который вы указали в верхней части кода, и его нелегко изменить с помощью размера (хотя размер можно указать во время выполнения, и вы можете «изменить его размер», создав новый массив и скопировав его).содержимое старого массива).

Массив словарей выглядит следующим образом:

var dictionaries = new Dictionary<string, string>[0];

Если вы хотите указать размер во время выполнения, просто замените [0] на переменную.

1 голос
/ 20 октября 2010

Вы можете попробовать использовать ArrayList<Dictionary<string,string>>

ArrayList ведет себя как массив, но может добавляться динамически.

Альтернативно, посмотрите на классы, доступные в System.Xml.Linq

0 голосов
/ 20 октября 2010

Если целью этого является редактирование XML-файлов, вы используете не тот инструмент для этой работы.Я бы настоятельно предложил бы использовать Linq для XML.Вот довольно простой пример того, как изменить файл XML с помощью Linq.

using System.Xml.Linq;
//starting with the XML you provided:
/*
<Parents>
    <Parent id="ParentA" description="New">
        <Children>
            <Child name="ChildA" />
        </Children>
    </Parent>
</Parents>
*/

XDocument xdoc = XDocument.Load(@"\path\to\xml\file");

// get the first <child> element (the long way)
XElement xeParents = xdoc.Descendants("Parents").FirstOrDefault();
XElement xeParent = xeParents.Descendants("Parent").FirstOrDefault();
XElement xeChildren = xeParent.Descendants("Children").FirstOrDefault();
XElement xeChild = xeChildren.Descendants("Child").FirstOrDefault();

//Change the value of an attribute
xeParent.SetAttributeValue("id", "ParentB");

//let's add another child for fun
XElement xeChild2 = new XElement("Child");
xeChild2.SetAttributeValue("name", "ChildB");
xeChildren.Add(xeChild2);

xdoc.Save(@"\path\to\save\file");



//a shorter way to get the first <Child> would be:
xeChild = xdoc.Descendants("Child").FirstOrDefault();

//now the XML would look like this: 
/*      
<Parents>
    <Parent id="ParentB" description="New">
        <Children>
            <Child name="ChildA" />
            <Child name="ChildB" />
        </Children>
    </Parent>
</Parents>
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...