Enumerable.OrderBy方法是否保留具有相同排序的项目的插入顺序 - 包括转换类型?

时间:2017-02-12 23:32:04

标签: vb.net sorting type-conversion preserve

我找到this documentationEnumerable.OrderBy(Of TSource, TKey) Method (IEnumerable(Of TSource), Func(Of TSource, TKey))),其中包含:

  

此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定排序不会保留具有相同键的元素的顺序。

但是,我对稳定不稳定排序(?)之间的差异一无所知。

假设我有一个公共属性,一个名为fieldsas 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

与上述代码有关的两个疑问:

  1. 对于具有相同Parser的元素,保留fields已将元素插入数组order的顺序是什么?
  2. printFields_Dic_Sort()的订单可能与printFields_Sort_Dic()不同吗? (第一个转换然后排序;第二个排序,然后转换为Dictionary
  3. 无法加入关于此的明确信息...... 谢谢

    EDITED

    为已返回的Dictionary

    添加了类型

    好的,这就是问题所在:

    1. 如果我想让KeyValuePair(idx,obj)无法使用array错误:这是可能的;挑战是如何在数组之间进行转换)< / LI>
    2. 我无法将已排序的array存储在Dictionary中,因为无法保证迭代它会给出有序的values正确:无法保证通用词典,见下文)。
    3. 可以选择使用SortedDictionary。但是,没有从arraySortedDictionary的直接转换(除非您进行迭代)...(**右*?*:array / {{1之间没有平凡的转换}}和list
    4. 然后,为了一个简单快速的解决方案,它只能使用SortedDictionary。但是,也存在问题,因为它应该是list的列表,我无法通过使用KeyValuePair直接从array获取(错误:可以获得toList,但是,它需要先前的转换。)
    5. 所以没有优雅(简短)的解决方案......(正确:没有评论)

      任何帮助都将受到高度赞赏(仍在使用它) - 解决方案如下......

      编辑II

      好的,这就是我最终做的事情:使用List (Of KeyValuePair (Of ...))msdn)并定义我自己的array.ConvertAll函数来解决第4点的问题...转换{{然后,从已经转换为Converter类型的中间array获取ListToList。希望它可以帮助别人:

      array
      上述测试的

      结果

      (Of KeyValuePair (Of String, clsFld))

1 个答案:

答案 0 :(得分:1)

  1. 稳定排序保留了它们具有相同值的元素的顺序,所以是的,它们将以添加它们的相同顺序部分返回。但这并不重要,因为你以后会把它们推到字典里。见下文。

  2. Dictionary<TKey, TValue>未定义排序,可能无法保留元素l的顺序。因为printFields_Sort_Dic()可能会以不同的顺序返回它们。