使用LINQ按组排序频繁的XML数据

时间:2015-02-11 13:00:33

标签: c# linq

我有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");

2 个答案:

答案 0 :(得分:4)

您可以使用简单的GroupByOrderByDescending

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