2012-05-15 4 views
0

У меня есть следующие XML:LinqToXml: разбор словарю

<Places Count='50'> 
<Place ID='1' Row='1' Place='1' Type='1' Fragment='0'></Place> 
<Place ID='2' Row='1' Place='2' Type='1' Fragment='0'></Place> 
<Place ID='3' Row='1' Place='3' Type='2' Fragment='0'></Place> 
<Place ID='4' Row='1' Place='4' Type='2' Fragment='0'></Place> 
<Place ID='5' Row='1' Place='5' Type='2' Fragment='0'></Place> 
//other tags 
</Places> 

Я хочу получить Dictionary<int, int> со следующим содержанием:

1,2 // 0 element in the Dictionary (type =1; count = 2) 
2,3; // 1 element in the Dictionary (type =2; count = 3) 

Первый параметр в XML Type, то второй параметр количество таких типов.

Спасибо.

+0

... Так что вы пробовали? –

+0

Я не могу понять, как заключить его в словарь – user1260827

ответ

6

LINQ к XML в сочетании с LINQ к объектам делает это очень просто:

var dictionary = doc.Descendants("Place") 
        .GroupBy(x => (int) x.Attribute("Type")) 
        .ToDictionary(g => g.Key, g => g.Count()); 

Это не так эффективно, как это могло быть, но я бы придерживаться этой реализации, пока я не нашел, что это стало проблемой.

Обратите внимание, что говорить о «0 элементе» в словаре является вводящим в заблуждение - словари не имеют надежного порядка: вы не должны предполагать, что если вы перебираете пары ключ/значение, вы увидите их в любом конкретном порядке.

1

Синтаксис запросов

var dict = (from place in root.Descendants("Place") 
     group place by (int)place.Attribute("Type") into g 
     select g).ToDictionary(g=>g.Key, g=>g.Count()); 
Смежные вопросы