我正在获取一个 csv 文件并将其转换为 XML,并且效果很好。
XML 看起来像这样
<Root>
<Player index="0">
<Rank>
<Level> A</Level>
<Class> 1</Class>
</Rank>
<TopScores>
<Lives> 1.0</Lives>
<Kills> 0.0</Kills>
<Time> 9:59:55</Time>
</TopScores>
</Player>
<Player index="1">
<Rank>
<Level> A</Level>
<Class> 2</Class>
</Rank>
<TopScores>
<Lives> 1.2</Lives>
<Kills> 0.0</Kills>
<Time> 9:59:59</Time>
</TopScores>
</Player>
<Player index="2">
<Rank>
<Level> A</Level>
<Class> 3</Class>
</Rank>
<TopScores>
<Lives> 1.2</Lives>
<Kills> 0.0</Kills>
<Time>10: 0: 3</Time>
</TopScores>
</Lives>
<Player index="3">
<Rank>
<Level> A</Level>
<Class> 1</Class>
</Rank>
<TopScores>
<Lives> 0.9</Lives>
<Kills> 0.0</Kills>
<Time>10: 0: 8</Time>
</TopScores>
</Player>
</Root>
如您所见,有一个重复的等级(1 级,0 级)。
我可以通过以下查询获得重复的数量:
//The query below will return the duplicates so we can report the identities
//and the count of the number of duplicates.
var duplicates = playerData.Descendants("Rank")
.GroupBy(c => c.ToString())
.Where(g => g.Count() > 1)
.Select(g => g.First().Value);
我想获得所有“排名”值的完整玩家数据,但是,如果有重复的“排名”值,我想获得最后一次出现。所以对于上面的 XML 数据,我应该只返回三组 Player 数据,当有重复时,它应该是最新时间或 id 的那一组。
为此,我尝试过:
var uPlays = playerData.Descendants("Player").Descendants("Rank")
.GroupBy(z => z.ToString())
.Select(b => b.Ancestors().First());
这为我提供了 Rank 的唯一值的所有 Player 数据,但当然它为我提供了遇到的第一个实例。我以为我会更改.First()
为.Last()
,但这只会让我重复第一个值的三倍。