嗨,我有下一个功能:
输入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
答案 0 :(得分:2)
来自MSDN - HashTable:
表示根据键的哈希码组织的键/值对的集合。
这解释了为什么您没有按照预期的顺序获取项目 - 它们按密钥的哈希排序。
如果您需要保留排序,请使用SortedList
或OrderedDictionary
。
答案 1 :(得分:1)
排序的最佳方法是使用泛型类进行排序,可以在整个应用程序中进行排序。
使用以下使用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
答案 2 :(得分:0)
HashList
中的订单未确定。请改用TreeMap
。见Sort a Map<Key, Value> by values (Java)
答案 3 :(得分:0)
常规哈希表不定义元素的顺序。您可能需要树结构。从树中检索是O(log N)与散列的O(1)。这可能是也可能不是问题。