在.Net 2.0中使用C#
当有人加入我的服务器时,我想添加他们的名字,以及他们加入列表/词典的DateTime,以及他们经常更新的分数。
然后我希望能够根据布尔值按DateTime或得分对列表/字典进行排序,这样我就可以返回列表/字典的前50%。即返回加入和现在之间最长50%的最长时间的名称,或者返回前50%的得分。
我尝试使用两个单独的词典,然后使用自定义按值排序方法,但它很麻烦,似乎不起作用。
这样做有一种优雅的方法吗?
答案 0 :(得分:2)
我认为您可以将DateTime和得分作为一对,并将其存储为您的收藏中的关键字。
然后您可以使用Array.Sort对键集合进行排序,并且可以通过IComparer传递Sort方法,IComparer可以根据您的要求实现。
答案 1 :(得分:1)
创建实现ICompare(Of T)
的类。我意识到你是用C#编写的,但这是VB.NET代码。
Public Class Main
Public Sub SortByLoginTime(accounts As IList(Of UserAccount))
Array.Sort(accounts, New UserAccountLoginTimeComparer)
End Sub
Public Sub SortByScore(accounts As IList(Of UserAccount))
Array.Sort(accounts, New UserAccountScoreComparer)
End Sub
End Class
Public Class UserAccount
Public Property LoginTime As Date
Public Property Score As Integer
End Class
Public Class UserAccountLoginTimeComparer
Implements IComparer(Of UserAccount)
Public Function Compare(x As UserAccount, y As UserAccount) As Integer Implements System.Collections.Generic.IComparer(Of UserAccount).Compare
Return Date.Compare(x.LoginTime, y.LoginTime)
End Function
End Class
Public Class UserAccountScoreComparer
Implements IComparer(Of UserAccount)
Public Function Compare(x As UserAccount, y As UserAccount) As Integer Implements System.Collections.Generic.IComparer(Of UserAccount).Compare
Return x.Score - y.Score
End Function
End Class
答案 2 :(得分:1)
您可以创建一个代表每个用户的类:
class User {
public string Name { get; set; }
public DateTime DateJoined { get; set; }
public int Score { get; set; }
}
然后,如果你有一个用户列表
List<User> users = new List<User>();
你可以按分数对其进行排序:
users.Sort(delegate (string left, string right) {
return left.Score.CompareTo(right.Score);
});
或加入日期:
users.Sort(delegate (string left, string right) {
return left.DateJoined.CompareTo(right.DateJoined);
});
如果您可以使用C#3或更高版本,那么使用Linq和Lambda表达式会更好。
例如:
var top50pcUsersByScore = users.OrderBy(u => u.Score).Take(users.Count / 2);