存储和排序同时具有 DateTime 和 Int 值的人员列表
Posted
技术标签:
【中文标题】存储和排序同时具有 DateTime 和 Int 值的人员列表【英文标题】:Store and sort list of people that have both a DateTime and Int value 【发布时间】:2011-07-20 01:37:41 【问题描述】:在 .Net 2.0 中使用 C#
当有人加入我的服务器时,我想将他们的姓名、他们加入的日期时间以及他们的分数添加到列表/字典中,这些分数会经常更新。
然后,我希望能够基于布尔值按 DateTime 或分数对该列表/字典进行排序,以便返回列表/字典的前 50%。即返回加入和现在之间时间最长的前 50% 的名称,或前 50% 的分数。
我尝试使用两个单独的字典,然后使用自定义的按值排序方法,但它很混乱,而且似乎不起作用。
有没有一种优雅的方式来做到这一点?
【问题讨论】:
【参考方案1】:我认为您可以将 DateTime 和 score 作为一对,并将其作为密钥存储在您的集合中。
然后可以使用Array.Sort对keys集合进行排序,Sort方法可以传入一个IComparer,可以根据自己的需求实现。
【讨论】:
【参考方案2】:您可以创建一个类来代表每个用户:
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);
【讨论】:
我希望我可以使用 linq,但对于这个特定项目,我坚持使用 2.0【参考方案3】:创建实现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
【讨论】:
以上是关于存储和排序同时具有 DateTime 和 Int 值的人员列表的主要内容,如果未能解决你的问题,请参考以下文章
mysql 把时间换成时间戳进行存储在int字段中还是直接用datetime好