存储和排序同时具有 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好

如何在 Azure 数据工厂上对存储过程进行排序?

SQL条件排序依据?

C# DateTime OrderBy 当列表包含一些相同的 DateTime 值时

时间存储在MySQL里面选择啥类型更好

C ++ - 同时对一对向量的第一个和第二个进行排序