加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#对象排名,多重条件

发布时间:2020-12-15 18:12:08 所属栏目:百科 来源:网络整理
导读:我正在建立一个我写的LAN聚会网站的插件,可以使用Round Robin锦标赛. 一切进展顺利,但我对有两种标准的最有效的方法提出了一些问题. 基本上,我想要以下排名布局: Rank Wins TotalScorePersonE 1 5 50PersonD 2 3.5 37PersonA 2 3.5 37PersonC 4 2.5 26Perso
我正在建立一个我写的LAN聚会网站的插件,可以使用Round Robin锦标赛.

一切进展顺利,但我对有两种标准的最有效的方法提出了一些问题.

基本上,我想要以下排名布局:

Rank  Wins  TotalScore
PersonE  1     5     50
PersonD  2     3.5   37
PersonA  2     3.5   37
PersonC  4     2.5   26
PersonB  5     2.5   24
PersonF  6     0     12

在SQL Server中,我将使用:

SELECT
    [Person],RANK() OVER (ORDER BY Wins DESC,TotalScore DESC) [Rank],[Wins],[TotalScore]

现在,我只有List,Dictionary等才能使用

特别:

Dictionary<TournamentTeam,double> wins = new Dictionary<TournamentTeam,double>();
Dictionary<TournamentTeam,double> score = new Dictionary<TournamentTeam,double>();

有没有办法用LINQ做这样的排名风格?

如果没有,是否有一种可扩展的方式,让我以后能够参与Win-Loss-Draw的帐户,而不是仅仅赢得选择?

编辑:

我的适应TheSoftwareJedi的答案:

private class RRWinRecord : IComparable
{
    public int Wins { get; set; }
    public int Losses { get; set; }
    public int Draws { get; set; }
    public double OverallScore { get; set; }
    public double WinRecord
    {
        get
        {
            return this.Wins * 1.0 + this.Draws * 0.5 + this.Losses * 0.0;
        }
    }

    public int CompareTo(object obj) { ... }

    public override bool Equals(object obj) { ... }
    public override int GetHashCode() { ... }
    public static bool operator ==(RRWinRecord lhs,RRWinRecord rhs) { ... }
    public static bool operator !=(RRWinRecord lhs,RRWinRecord rhs) { ... }
    public static bool operator >(RRWinRecord lhs,RRWinRecord rhs) { ... }
    public static bool operator <(RRWinRecord lhs,RRWinRecord rhs) { ... }
    public static bool operator >=(RRWinRecord lhs,RRWinRecord rhs) { ... }
    public static bool operator <=(RRWinRecord lhs,RRWinRecord rhs) { ... }
}

...

    int r = 1,lastRank = 1;
    RRWinRecord lastRecord = null;

    var ranks = from team in records.Keys
                let teamRecord = records[team]
                orderby teamRecord descending
                select new RRRank() { Team = team,Rank = r++,Record = teamRecord };

    foreach (var rank in ranks)
    {
        if (rank.Record != null && lastRecord == rank.Record)
        {
            rank.Rank = lastRank;
        }

        lastRecord = rank.Record;
        lastRank = rank.Rank;

        string scoreDescription = String.Format("{0}-{1}-{2}",rank.Record.Wins,rank.Record.Losses,rank.Record.Draws);
        yield return new TournamentRanking(rank.Team,rank.Rank,scoreDescription);
    }

    yield break;

解决方法

这应该适用于非密集级别:
static class Program
{

    static IEnumerable<Result> GetResults(Dictionary<TournamentTeam,double> wins,Dictionary<TournamentTeam,double> scores)
    {
        int r = 1;
        double lastWin = -1;
        double lastScore = -1;
        int lastRank = 1;

        foreach (var rank in from name in wins.Keys
                             let score = scores[name]
                             let win = wins[name]
                             orderby win descending,score descending
                             select new Result { Name = name,Score = score,Win = win })
        {
            if (lastWin == rank.Win && lastScore == rank.Score)
            {
                rank.Rank = lastRank;
            }
            lastWin = rank.Win;
            lastScore = rank.Score;
            lastRank = rank.Rank;
            yield return rank;
        }
    }
}

class Result
{
    public TournamentTeam Name;
    public int Rank;
    public double Score;
    public double Win;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读