2013-08-19 3 views
1

CSV 파일을 가져와 XML로 변환하는 중입니다. 당신이 중복 등급 (레벨 1, 클래스 0)이 볼 수 있듯이linq에서 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> 

것 같습니다.

나는 다음과 같은 쿼리를 중복의 수를 얻을 수 있습니다

: 중복 '순위'값이있는

//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 데이터의 경우 3 세트의 플레이어 데이터 만 반환해야하며 복제본이있는 경우 최신 시간 또는 ID가있는 복제본이어야합니다.

내가 시도 이렇게하려면 다음을 수행

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

이이 순위의 고유 한 값 나에게 모든 선수 데이터를 제공하지만, 물론 그것이 처음 발견 된 인스턴스가 날 수 있습니다. 나는 단지 .First()에서 .Last()으로 변경하겠다고 생각했지만 이것은 처음 값이 세 번 중복 된 것을 보여줍니다.

답변

2

그래서 내가 당신의 첫 번째 제안 나를 위해 작동하지 않습니다 이유는 생각

var uPlays = playerData.Descendants("Player") 
         .Descendants("Rank") 
         .GroupBy(z => z.ToString()) 
         .Select(b => b.Last().Parent); 
+0

감사 라파엘, 내가 XElement를 함께 일하고이

var uPlays = playerData.Root.Elements("Player") .GroupBy(c => c.Element("Rank").ToString()) .Select(g => g.Last()); 

또는 사용하여 코드 같은 것을 시도 할 것이다 . 두 번째 제안은 매력처럼 작동합니다! 물론 내가 바꿨지. 우선. 마지막.이 작품. 나는 무슨 일이 일어나고 있는지 더 잘 이해하기를 바란다. 누구나 좋아하는 참조가 있습니까? – maxthestork