1

私は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 データの 3 つのセットのみを返す必要があり、重複がある場合は、最新の時刻または ID を持つものにする必要があります。

これを行うために、私は試しました:

var uPlays = playerData.Descendants("Player").Descendants("Rank")
                       .GroupBy(z => z.ToString())
                       .Select(b => b.Ancestors().First());

これにより、ランクの一意の値に関するすべてのプレイヤー データが得られますが、もちろん最初に遭遇したインスタンスも得られます。.First()に変更するだけだと思っていまし.Last()たが、これにより、最初の値が 3 回複製されます。

4

1 に答える 1