我找到this documentation(Enumerable.OrderBy(Of TSource, TKey) Method (IEnumerable(Of TSource), Func(Of TSource, TKey))
),其中包含:
此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定排序不会保留具有相同键的元素的顺序。
但是,我对稳定和不稳定排序(?)之间的差异一无所知。
假设我有一个公共属性,一个名为fields
(as clsField()
)的数组,其中parser
放置了所有对象......
Public Class clsField
Public idx As String
Public name As String
Public order As Long
End Class
Public Class Container
Public fields As clsField()
Public Function getFields() As Dictionary(Of String, clsField)
If (fields Is Nothing) OrElse (fields.Count < 1) Then Return New Dictionary(Of String, clsField)
Return fields.OrderBy(Function(fld) fld.order).ToDictionary(Of String, clsField)(Function(fld) fld.idx, Function(fld) fld)
End Function
Public Function getFields(blnAlternative As Boolean) As Dictionary(Of String, clsField)
If (fields Is Nothing) OrElse (fields.Count < 1) Then Return New Dictionary(Of String, clsField)
Return fields.ToDictionary(Of String, clsField)(Function(fld) fld.idx, Function(fld) fld).OrderBy(Function(pair) pair.Value.order)
End Function
End Class
Public Class Consumer
Public cont As Container
Public parse As Parser
Public Sub New(strFormat)
cont = New Container
cont.fields = parse.deserializeOject(Of clsField())(strFormat)
End Sub
Public Sub printFields_Sort_Dic()
For Each fld As clsField In cont.getFields().Values
Console.WriteLine(fld.ToString)
Next
End Sub
Public Sub printFields_Dic_Sort()
For Each fld As clsField In cont.getFields(True).Values
Console.WriteLine(fld.ToString)
Next
End Sub
Public Sub Main()
printFields_Dic_Sort()
printFields_Sort_Dic()
End Sub
End Class
与上述代码有关的两个疑问:
Parser
的元素,保留fields
已将元素插入数组order
的顺序是什么?printFields_Dic_Sort()
的订单可能与printFields_Sort_Dic()
不同吗? (第一个转换然后排序;第二个排序,然后转换为Dictionary
)无法加入关于此的明确信息...... 谢谢
EDITED
为已返回的Dictionary
好的,这就是问题所在:
KeyValuePair
(idx,obj)无法使用array
(错误:这是可能的;挑战是如何在数组之间进行转换)< / LI>
array
存储在Dictionary
中,因为无法保证迭代它会给出有序的values
(正确:无法保证通用词典,见下文)。SortedDictionary
。但是,没有从array
到SortedDictionary
的直接转换(除非您进行迭代)...(**右*?*:array
/ {{1之间没有平凡的转换}}和list
)SortedDictionary
。但是,也存在问题,因为它应该是list
的列表,我无法通过使用KeyValuePair
直接从array
获取(错误:可以获得toList
,但是,它需要先前的转换。)所以没有优雅(简短)的解决方案......(正确:没有评论)
任何帮助都将受到高度赞赏(仍在使用它) - 解决方案如下......
编辑II
好的,这就是我最终做的事情:使用List (Of KeyValuePair (Of ...))
(msdn)并定义我自己的array.ConvertAll
函数来解决第4点的问题...转换{{然后,从已经转换为Converter
类型的中间array
获取List
,ToList
。希望它可以帮助别人:
array
上述测试的结果:
(Of KeyValuePair (Of String, clsFld))
答案 0 :(得分:1)
稳定排序保留了它们具有相同值的元素的顺序,所以是的,它们将以添加它们的相同顺序部分返回。但这并不重要,因为你以后会把它们推到字典里。见下文。
Dictionary<TKey, TValue>
未定义排序,可能无法保留元素l的顺序。因为printFields_Sort_Dic()
可能会以不同的顺序返回它们。