2016-04-25 41 views
4

我有記錄清單,每條記錄有名稱回合大紅大紫分隔級聯數「 - 」Linq groupby return unique group

enter image description here

哪能名稱和只顯示獨特的輪組,也算回合數,並顯示在第一輪和最後一輪

enter image description here

這裏是我試過,

data.GroupBy(d => d.Name) 
.Select(
    g => new 
    { 
     Name = g.Key, 
     Rounds = g.Concat(s => s.Rounds), 
     NumberOfRounds = g.Concat(s => s.Rounds).Split('-').Count, 
     FirstRound = //??, 
     LastRound = //??, 
    }); 
+0

使用'.SelectMany()'我不是在我的電腦或我會發佈一個答案。 –

回答

5

我會你的實體投影到一個名稱和資源集合的回合對開始。這將更容易處理。例如:

var query = results 
    .Select(d => new { d.Name, Results = d.Rounds.Split('-').Select(int.Parse).ToList() }) 
    .GroupBy(
     d => d.Name, (key, values) => new { 
      Name = key, 
      Rounds = values.SelectMany(v => v.Rounds) 
          .Distinct() 
          .OrderBy(x => x) 
          .ToList() 
     }); 

隨着作爲列表提供的回合,我看不出有什麼意義有NumberOfRoundsFirstRoundLastRound的屬性,你可以使用Rounds.CountRounds.First()Rounds.Last()。重要的部分是儘可能早地將數據轉換爲更有用的格式。

如果你真的需要,在性能,這是很容易的項目:

// query as before, but with 
.Select(x => new { 
    x.Name, 
    x.Rounds, 
    NumberOfRounds = x.Rounds.Count, 
    FirstRound = x.Rounds.First(), 
    LastRound = x.Rounds.Last() 
}); 
+0

thx回答我的問題! – Maro

1

首先,您需要將回合提取爲數字值。之後,這很容易。

var data = ...; 
var groupedData = data 
    .GroupBy(x => x.Name) 
    .Select(x => new { 
     Name = x.Key, 
     Rounds = string.Join("-", x.Select(z => z.Rounds)) 
      .Split('-') 
      .Distinct() 
      .Select(z => int.Parse(z)) 
      .OrderBy(z => z) 
      .ToArray() 
    }) 
    .Select(x => new { 
     x.Name, 
     Rounds = string.Join("-", x.Rounds), 
     NumberOfRounds = x.Length, 
     FirstRound = x.Min(), 
     LastRound = x.Max() 
    }) 
    .ToArray(); 
+0

@juharr圓括號在哪裏?而'.ToArray()'不是'string.Join(...)'調用的一部分。 – Maarten

+0

第一個'Select'中的'x'是一個'IGrouping',因此它沒有'Rounds'屬性。 – juharr

+0

@juharr謝謝,糾正。 – Maarten