当前位置: 首页 > 编程语言 > C#

C#对象排名,多标准共享

时间:2023-04-10 21:19:50 C#

C#对象排名,多标准一切进展顺利,但我对对两个以上标准进行排名的最有效方式有一些疑问。基本上,我想要以下排名布局:RankWinsTotalScorePersonE1550PersonD23.537PersonA23.537PersonC42.526PersonB52.524PersonF6012在SQLServer中我会使用:SELECT[Person],RANK()OVER(ORDERBYWinsDESC,TotalScoreDESC)[Rank],[Wins],[TotalScore]现在,我只有List、Dictionary等可以使用Special:Dictionarywins=newDictionary();Dictionaryscore=newDictionary();有没有办法用LINQ进行这种排名?如果没有,是否有一种可扩展的方式,如果我选择的话,我以后可以考虑Win-Loss-Draw而不仅仅是Win?编辑:我改编了TheSoftwareJedi的回答:privateclassRRWinRecord:IComparable{publicintWins{get;放;}publicintLosses{get;放;}publicintDraws{得到;放;}publicdoubleOverallScore{get;放;}publicdoubleWinRecord{get{returnthis.Wins*1.0+this.Draws*0.5+this.Losses*0.0;}}publicintCompareTo(objectobj){...}publicoverrideboolEquals(objectobj){...}publicoverrideintGetHashCode(){...}publicstaticbooloperator==(RRWinRecordlhs,RRWinRecordrhs){...}publicstaticboolol运算符!=(RRWinRecordlhs,RRWinRecordrhs){...}publicstaticbooloperator>(RRWinRecordlhs,RRWinRecordrhs){...}publicstaticbooloperator=(RRWinRecordlhs,RRWinRecordrhs){...}publicstaticbooloperator<=(RRWinRecordlhs,RRWinRecordrhs){...}}...intr=1,lastRank=1;RRWinRecordlastRecord=null;varranks=fromteaminrecords.Keys让teamRecord=records[team]orderbyteamRecorddescendingselectnewRRRank(){Team=team,Rank=r++,Record=teamRecord};foreach(varrankinranks){if(rank.Record!=null&&lastRecord==rank.Record){rank.Rank=lastRank;}lastRecord=rank.Record;lastRank=rank.Rank;stringscoreDescription=String.Format("{0}-{1}-{2}",rank.Record.Wins,rank.Record.Losses,rank.Record.Draws);yieldreturnnewTournamentRanking(rank.Team,rank.Rank,scoreDescription);产量中断;适用于非密集合别:staticclassProgram{staticIEnumerableGetResults(字典胜,字典分数){intr=1;双lastWin=-1;双lastScore=-1;intlastRank=1;foreach(varrankinfromnameinwins.Keysletscore=scores[name]letwin=wins[name]orderbywindescending,scoredescending选择新结果{Name=name,Rank=r++,Score=score,Win=win}){if(lastWin==rank.Win&&lastScore==rank.Score){rank.Rank=lastRank;}lastWin=rank.Win;lastScore=rank.Score;lastRank=rank.Rank;收益率回报等级;}}}classResult{publicTournamentTeam名称;公共积分等级;公开双分;公开双赢;}排名并不太难只需将OrderBy和Select实现模式混合在一起,您就有了一个易于使用的排名扩展方法。像这样:publicstaticIEnumerableRank(thisIEnumerablesource,FunckeySelector,Funcselector){if(!source.Any()){yieldbreak;}intitemCount=0;T[]ordered=source.OrderBy(keySelector)。ToArray();TKeyprevious=keySelector(ordered[0]);int等级=1;foreach(Ttinordered){itemCount+=1;TKeycurrent=keySelector(t);如果(!current.Equals(previous)){rank=itemCount;}yieldreturnselector(t,rank);以前的=当前的;}}这里是一些测试代码//varquery=myNames.Rank(s=>s.Length,(s,r)=>new{s,r});//foreach(查询中的varx){Console.WriteLine("{0}{1}",xr,xs);}产生这些结果:1Bob1Jim3Mark3John3Lisa3Dave假设您有一个List结构,其中Result对象具有以下参数...Pesron-stringRank-intWins-doubleTotalScore-int你可以写一个自定义比较器并将其传递给List.Sort(Comparisoncomparison)或者,您可以使Result对象实现IComparable并将其粘贴在您的类中。#regionIComparableMemberspublicintCompareTo(Resultobj){if(this.Rank.CompareTo(obj.Rank)!=0)returnthis.Rank.CompareTo(obj.Rank);if(this.Wins.CompareTo(obj.Wins)!=0)return(this.Wins.CompareTo(obj.Wins);return(this.TotalScore.CompareTo(obj.TotalScore);}#endregion然后你可以调用List.Sort();这可能是一个开始:Dictionarywins=newDictionary();Dictionaryscore=newDictionary();Dictionaryranks=newDictionary();intr=1;ranks=(fromnameinwins.Keysorderbywins[name]descending,scores[name]descendingselectnew{Name=name,Rank=r++}).ToDictionary(item=>item.Name,item=>item.Rank);我意识到我迟到了聚会,但我还是想拍。这是一个专门使用LINQ的版本:privateIEnumerableGetRankings(Dictionarywins,Dictionaryscores){varoverallRank=1;从团队中返回wins.Keysgroupteambynew{Wins=wins[team],TotalScore=scores[team]}intorankGrouporderbyrankGroup.Key.Winsdescending,rankGroup.Key.TotalScoredescendingletcurrentRank=overallRank++fromteaminrankGroup选择新的TeamRank(团队,currentRank,rankGroup.Key.Wins,rankGroup.Key.TotalScore);}返回类型:以上是C#学习教程:C#对象排行,多标准共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicclassTeamRank{publicTeamRank(TournamentTeamteam,intrank,doublewins,doubletotalScore){this.Team=团队;this.Rank=等级;this.Wins=获胜;this.TotalScore=totalScore;}publicTournamentTeamTeam{get;私有集;}publicintRank{得到;私有集;}publicdoubleWins{get;私有集;}publicdoubleTotalScore{get;私有集;}}本文收集自网络,不代表立场,如如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: