我有XDocument
这个数据:
<item>
<name>Name 1</name>
<group>foo</group>
...
</item>
<item>
<name>Name 2</name>
<group>bar</group>
...
</item>
<item>
<name>Name 3</name>
<group>foo</group>
...
</item>
这意味着我有2个group
= foo项和1个group
= bar项。如何按最频繁group
订购该数据?结果:
<item>
<name>Name 1</name>
<group>foo</group>
...
</item>
<item>
<name>Name 3</name>
<group>foo</group>
...
</item>
<item>
<name>Name 2</name>
<group>bar</group>
...
</item>
数据加载如下:
XDocument xml = XDocument.Load(@"\path\data.xml");
答案 0 :(得分:4)
您可以使用简单的GroupBy
和OrderByDescending
:
var items = xml.Root.Elements()
.GroupBy(r => r.Element("group").Value)
.OrderByDescending(r => r.Count())
.ToList();
然后只需删除所有节点并按顺序添加它们:
xml.Root.RemoveAll();
xml.Root.Add(items);
答案 1 :(得分:2)
如果您想使用对象而不是xml,那么您首先需要将xml
反序列化为List<Item>
,其中每个Item
都是xml中的结构相同。
之后,当您有列表时,可以使用GroupBy
:
var newList = list.GroupBy(i => i.Group) //group together by "group" value
.OrderByDescending(i => i.Count()) //simple ordering
.SelectMany(i => i) //flatten the hierarchy
.ToList(); //back to list