LINQで得点上位X件以上を取得し、順位をつけたい


よくある、「ポイント上位X件」をLINQで実現しようとしています。

[code]

    class Member {
        public string Name { get; set; }
        public int Point { get; set; }
    }
    
[/code]

のようなインスタンス配列を普通に、

[code]

    var SelectedMembers = AllMembers
        .OrderByDescending(mem => mem.Point)
        .Take(100);
    
[/code]

とかすると、同一ポイントの人が多数いる場合に正しく抽出できないように思います。  
これを、よくあるポイント順  
1.AAA  
2.BBB  
2.CCC  
4.DDD  
4.EEE  
4.FFF  
のように、指定人数以上になっても抽出し、同一ポイントを加味してグループリスト化するにはどうしたらよいでしょうか？




Pointが上位の数をそのまま数えて+1してものが、そのPointの順位になるので、

[code]

    var q1 = AllMembers.OrderByDescending(m => m.Point).Select((m) =>
        new
        {
            Point = m.Point,
            Name = m.Name,
            //Pointが上位の数をそのまま数えれば順位は調べられる
            Rank = AllMembers.Count(m2 => (m2.Point > m.Point)) + 1
        }).Where(ano => ano.Rank<=4);
    
    foreach (var ano in q1)
    {
        Console.WriteLine(string.Format("Rank={0}\tPoint={1}\tName={2}", ano.Rank, ano.Point, ano.Name));
    }
    
[/code]

または、重複を考慮せずにPointを降順に並べてN番目のPointがN位の点数になるので、先に点を調べておくことで計算量を少し減らしてみる。

[code]

    var po= AllMembers.OrderByDescending(m2=>m2.Point).Skip(4-1).FirstOrDefault().Point;
    var q2 = AllMembers.Where(m => m.Point >= po).OrderByDescending(m => m.Point).Select((m) =>
        new
        {
            Point = m.Point,
            Name = m.Name,
            Rank = AllMembers.Count(m2 => (m2.Point > m.Point)) + 1
        });
    
[/code]

とすることも。

