使用 LINQ 按组对频繁 XML 数据进行排序

Order frequent XML Data by group using 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");

您可以使用简单的 GroupByOrderByDescending:

var items = xml.Root.Elements()
                    .GroupBy(r => r.Element("group").Value)
                    .OrderByDescending(r => r.Count())
                    .ToList();

然后简单地删除所有节点并按顺序添加它们:

xml.Root.RemoveAll();
xml.Root.Add(items);

如果您想使用对象而不是 xml,您首先需要将 xml 反序列化为 List<Item>,其中每个 Item xml.

中相同结构的class

之后,当你有列表时,你可以使用 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