2011-07-20 44 views
1

使用C#.NET 2.0中存储和排序列表

当有人加入我的服务器,我想增加他们的名字,他们加入到列表中的日期时间/字典,以及他们的得分,经常更新。

然后,我希望能够根据布尔值根据日期时间或分数对列表/字典进行排序,以便我可以返回列表/字典的前50%。即返回加入和现在之间最长时间前50%的名称或前50%得分。

我试图使用两个单独的字典,然后使用价值的方法自定义排序,但它很混乱,似乎并没有工作。

有没有一个这样做的优雅方式?

回答

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); 
+0

我希望我可以使用linq,但我坚持2.0这个特定的项目 – Matt

2

我认为你可以将DateTime和score作为一对,并将它作为key存储在你的集合中。

然后你可以使用Array.Sort对键集合进行排序,并且Sort方法可以传递一个IComparer,它可以根据你的需求来实现。

+0

你能带着几分示例代码详细点吗? – Matt

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