2017-08-23 1 views
0

私は以下のリストを持っています。リストは名前とスコアのリストで構成されています。C#でのLinqリストランキング

Name Score 
    Ed 5 
    John 6 
    Sara 7 
    Dean 3 
    Nora 4 

だから私は、リストのグループすることができたとの合計を作るが、今私はに基づいてこれらをランク付けしようとしています:私はpeopeのリストのためのポイントの合計を取得するためにLINQを使用することから得た得点スコア。だから私は、以下のリストを取得しようとしています:

Rank Name Score 
1 Sara 7 
2 John 6 
3 Ed 5 
4 Nora 4 
5 Dean 3 

をしかし、私は使用していますLINQのコードは私のために右のランクを取得していないようです。私は、LINQで正しいランクを含める方法をお知りになりたい

public class Person 
    { 

     public int Rank { get; set; } 
     public string Name { get; private set; } 
     public int Score { get; set; } 

     public Person(int rank, string name, int score) 
     { 
      Rank = rank; 
      Name = name; 
      Score = score; 

     } 
    } 

    public ObservableCollection<Person> Persons { get; set; } 
    public MainWindow() 
    {    
Persons = new ObservableCollection<Person>(); 
     var data = lines.Select(line => { 
     var column = line.Split(','); 
     var name = column[0]; 
     int score = int.Parse(column[1]); 
     int rank =0; 
     return new { name, score, rank }; 
    }); 

     var groupedData = data.OrderByDescending(x => x.score).GroupBy(p => p.name).Select((g, i) => new { name = g.Key, rank=i+1, score = g.Sum(p => p.score)}); 

    var persons = groupedData.Select(p => new Person(p.rank, p.name, p.score)); 

    foreach (var person in persons) { 
     Persons.Add(person); 
    } 
    datagrid.ItemsSource = Persons; 
} 

は、ここでリストを作成し、合計を作るとランキングのために私のコードです。

答えて

5

groupedData(合計スコアがある)には、合計されていない個別のスコアを含む生データではなく、合計スコアがあります。

var persons = groupedData.Select(p => new Person(p.rank, p.name, p.score)).OrderByDescending(x => x.Score); 

編集:(Person.Rankに正しい順位を置く)

var groupedData = data.GroupBy(p => p.name).Select(g => new { name = g.Key, score = g.Sum(p => p.score)}).OrderByDescending(x => x.score); 
var persons = groupedData.Select((p,i) => new Person(i+1, p.name, p.score)); 
+0

挨拶:ここ

は私の質問と解決策でした。私はあなたの提案した解決策を試しましたが、私はまだ正しいランクを得ていません:S –

+0

ランクはリストの位置にエンコードされています。私は 'Person.Rank'でそれを提供するように答えを更新します。 – Haukinger

+0

パーフェクト!今私は同じスコアを持つ人のランキングを修正する方法を理解する必要があります。ありがとうございました:) –

0

私はしばらく前にこれに類似した質問をしました。私の問題は、もし人々が同じスコアを持っていれば、その人に間違ったランクを割り当ててしまうということでした。あなたの現在のコードでは、Johnもスコアが7だった場合、彼はスコアで注文し、#1の本当に結婚したときのリストの位置を使用するだけで#2にランク付けされます。お返事ありがとうございました、Get the index of item in list based on value

+0

ありがとうございます。その実装がどのように問題を解決したか分からなかったので、あなたは親切にソリューションを説明できますか? –