使用 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");
您可以使用简单的 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);
如果您想使用对象而不是 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
我有一个 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");
您可以使用简单的 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);
如果您想使用对象而不是 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