Как заказать HashList? - PullRequest
       0

Как заказать HashList?

1 голос
/ 26 марта 2012

Привет, я получил следующую функцию:
Входные результаты ArrayList упорядочены правильно.
Возвращаемое значение returnList полностью неупорядочено.
Я думаю, проблема в том, что HashTable не упорядочен правильно.
Есть ли способ, которым я могу заказать Hashtable или я должен каким-то образом отсортировать returnList?
Я хочу заказать или отсортировать по полю.

Private Function FilterDepartementenSurveys(ByVal results As ArrayList) As ArrayList
    Dim hashTable As New Hashtable(results.Count)

    For Each resultaat As DTO.Results.Reporting.FilledInSurvey In results
        If Not hashTable.ContainsKey(resultaat.DepartmentCode) Then
            hashTable.Add(resultaat.DepartmentCode, New ArrayList)
        End If
        Dim arraylist As ArrayList = CType(hashTable(resultaat.DepartmentCode), Collections.ArrayList)
        arraylist.Add(resultaat)
    Next

    Dim returnList As New ArrayList
    For Each list As ArrayList In hashTable.Values
        returnList.Add(list)
    Next

    Return returnList
End Function

Ответы [ 4 ]

2 голосов
/ 26 марта 2012

Из MSDN - HashTable :

Представляет коллекцию пар ключ / значение, которые организованы на основе хэш-кода ключа.

Это объясняет, почему вы не получаете элементы в ожидаемом порядке - они упорядочиваются по хешу ключа.

Если вам нужно сохранить порядок, используйте SortedList или OrderedDictionary.

1 голос
/ 26 марта 2012

Лучший способ сортировки - использовать универсальный класс для сортировки, который можно использовать в приложении для сортировки.

Используйте следующий класс, который использует выражения Linq и Lamda.

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Linq.Expressions

Public Class GenericSorter(Of T)

Public Function Sort(ByVal source As IEnumerable(Of T), _
                     ByVal sortBy As String, _
                     ByVal sortDirection As String) As IEnumerable(Of T)

    Dim param = Expression.Parameter(GetType(T), "item")

    Dim sortExpression = Expression.Lambda(Of Func(Of T, Object))_
    (Expression.Convert(Expression.[Property](param, sortBy), _
    GetType(Object)), param)

    Select Case sortDirection.ToLower
        Case "asc"
            Return source.AsQueryable().OrderBy(sortExpression)
        Case Else
            Return source.AsQueryable().OrderByDescending(sortExpression)
    End Select

End Function

End Class

Для вызова этого класса используйте реализацию ниже

Dim gs As New GenericSorter(Of FileDepartmentSurveyData)
SurveyFormatItems = gs.Sort(SurveyFormatItems.AsQueryable, _
                             sortExpression, sortDirection).ToArray()

http://www.codeproject.com/Articles/37541/Generic-Sorting-with-LINQ-and-Lambda-Expressions

0 голосов
/ 26 марта 2012

Обычные хеш-таблицы не определяют порядок элементов.Возможно, вам нужна древовидная структура.Извлечение из дерева - это O (log N) против O (1) хеша.Это может или не может быть проблемой.

0 голосов
/ 26 марта 2012

Порядок в HashList не определен. Вместо этого используйте TreeMap. См. Сортировка карты по значениям (Java)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...