Хранить и сортировать список людей, которые имеют значения DateTime и Int - PullRequest
1 голос
/ 20 июля 2011

Использование C # в .Net 2.0

Когда кто-то присоединяется к моему серверу, я хочу добавить его имя, дату и время, которое они присоединили к списку / словарю, а также их счет, который часто обновляется.,

Затем я хочу иметь возможность отсортировать этот список / словарь по DateTime или счету, основываясь на логическом значении, чтобы я мог вернуть верхние 50% списка / словаря.т. е. возвращать имена 50% самых длинных промежутков времени между присоединением и сейчас или 50% лучших результатов.

Я попытался использовать два отдельных словаря, затем использовать пользовательский метод сортировки по значению, но этогрязный, и, кажется, не работает.

Есть ли элегантный способ сделать это?

Ответы [ 3 ]

2 голосов
/ 20 июля 2011

Я думаю, что вы можете сделать DateTime и забить как пара, и сохранить его как ключ в вашей коллекции.

Затем вы можете использовать Array.Sort для сортировки коллекции ключей, а метод Sort может быть передан IComparer, который может быть реализован в соответствии с вашими требованиями.

1 голос
/ 20 июля 2011

Вы можете создать класс для представления каждого пользователя:

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);
1 голос
/ 20 июля 2011

Создание классов, которые реализуют 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
...