Я согласен с Джоном Скитом.Это был бы более структурированный подход для упаковки информации, относящейся к одному и тому же человеку, в одну, скажем, <Person>
сущность.И вы также должны дать какое-то имя или удостоверение личности каждому штату;в противном случае ваши группировки выглядят произвольно.
<states>
<state Name="Florida">
<Person Name="a1">
<Address>a2</Address>
</Person>
<Person Name="b1">
<Address>b2</Address>
</Person>
<Person Name="c1">
<Address>c2</Address>
</Person>
</state>
<state Name="New York">
<Person Name="aa1">
<Address>aa2</Address>
</Person>
<Person Name="bb1">
<Address>bb2</Address>
</Person>
</state>
</states>
Вот как вы можете построить двухуровневый словарь.Внешний словарь определяется по имени штата и оценивается словарем, содержащим людей, проживающих в этом штате.Внутренний словарь вводится по имени человека и оценивается по его адресу.
XDocument document = XDocument.Parse(@"
<states>
<state Name=""Florida"">
<Person Name=""a1"">
<Address>a2</Address>
</Person>
<Person Name=""b1"">
<Address>b2</Address>
</Person>
<Person Name=""c1"">
<Address>c2</Address>
</Person>
</state>
<state Name=""New York"">
<Person Name=""aa1"">
<Address>aa2</Address>
</Person>
<Person Name=""bb1"">
<Address>bb2</Address>
</Person>
</state>
</states>");
IDictionary<string, Dictionary<string, string>> dictionary =
document.Root.Elements("state").ToDictionary(
state => state.Attribute("Name").Value,
state => state.Elements("Person").ToDictionary(
person => person.Attribute("Name").Value,
person => person.Element("Address").Value));
// To get address of "a1" living in Florida:
string addr1 = dictionary["Florida"]["a1"]; // gives "a2"
// To get address of "bb1" living in New York:
string addr2 = dictionary["New York"]["bb1"]; // gives "bb2"
Таким образом, чтобы получить адрес человека X
, проживающего в городе C
, вам просто нужно получить доступdictionary[C][X]
.
Редактировать : Ответить на комментарий:
Вы можете изменить имя человека, сначала удалив его запись (из внутреннего словаря), а затем повторнодобавив его (с новым именем в качестве ключа).
Например, чтобы изменить имя "aa1"
на "aa2"
:
Dictionary<string, string> innerDictionary = dictionary["New York"];
string address = innerDictionary["aa1"];
innerDictionary.Remove("aa1");
innerDictionary.Add("xx1", address);
Тем не менее, Dictionary<TKey, TValue>
можетне самая лучшая структура, если вам часто приходится менять ключи.