2011-07-20 45 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