【问题标题】:Associating a list with another that has been sorted将一个列表与另一个已排序的列表相关联
【发布时间】:2016-08-24 13:45:27
【问题描述】:

我有两个列表,一个整数和一个字符串。这些值是在循环期间输入的,因此它们是关联在一起的(例如 ListOfInteger.Item(i) 和 ListOfString.Item(i) 是同时输入的并且彼此相关)。我对整数列表进行排序并随后反转。有没有办法让字符串列表仍然与整数列表相关联,以便在文本框中显示它们。例如:

    List of Strings (surname):         List of Integers (score):
            Jones                                 4
            Perry                                 2
            Morris                                6

    List of Strings (surname):        Sorted List of Integers: 
            Jones                              2
            Perry                              4
            Morris                             6  

编辑:

If (name.Count + 1) < compnum Then
        name.Add(txtName.Text)
        score.Add(txtScore.Text)
Else 
        txtName.Text(Hide)
        txtScore.Text(Hide)
        btnSort.Text(Show)
End If  

...

score.Sort()
score.Reverse()
txtSortedScore1.Text = score(0) 
(and so forth)

如何将这两个列表关联起来,以便将字符串列表中的数据与已排序的整数列表相关联?

编辑 - 最终结果应如下所示:

 List of Strings (surname):        Sorted List of Integers: 
            Perry                              2
            Jones                              4
            Morris                             6

【问题讨论】:

标签: vb.net


【解决方案1】:

其他人建议的使用容器类或字典的技术是更好的解决方案。但是,要回答所述问题,您要做的是执行键控排序。不幸的是,List(Of T) 类不提供此功能。它由Array Class 提供。

这有点令人费解,因为首先将两个列表转储到数组中,对数组进行排序,最后使用排序结果重新创建列表。

Dim keysList As List(Of Int32) = New List(Of Integer)(New Int32() {4, 2, 6})
Dim itemsList As List(Of String) = New List(Of String)(New String() {"Jones", "Perry", "Morris"})

Dim keys As Int32() = keysList.ToArray
Dim items As String() = itemsList.ToArray
Array.Sort(keys:=keys, items:=items)

keysList = New List(Of Integer)(keys)
itemsList = New List(Of String)(items)

【讨论】:

    【解决方案2】:

    您应该将字符串和整数包装在另一个对象中。

    Class Person
        Public String SurName
        Public Int Score
    End Class
    

    您可以从那里以您喜欢的任何方式操作您的对象,然后对其进行迭代并根据需要输出数据。

    类似这样的:

    Dim persons = New List(Of Person)()
    
    persons.Add(New Person() With { _
        Key .SurName = "Jones", _
        Key .Score = 4 _
    })
    
    For Each p As var In persons.OrderBy(Function(x) x.Score)
        ListBox.Add(p.SurName + p.Score)
    Next
    

    如果您愿意提供代码,我们可以为您提供更多帮助。

    【讨论】:

    • 不幸的是,我的代码太大而无法提供。我正在使用通用列表并使用 For...Next 循环将项目添加到列表中。
    • 那么你应该简化你的代码,在一个孤立的例子中展示你的问题。
    • 我添加了代码的简化摘录。提到的文本框应包含最终结果的名称和分数。
    【解决方案3】:

    可以通过多种方式对名称进行排序。这是一种方法:

    Dim names = {"Jones", "Perry", "Morris"}, score = {4, 2, 6}
    
    Dim sortedIndexes = Enumerable.Range(0, score.Length).OrderBy(Function(i) score(i)).ToArray ' { 1, 0, 2 }
    
    Dim sortedNames = sortedIndexes.Select(Function(i) names(i)).ToList ' { "Perry", "Jones", "Morris" }
    Dim sortedScore = sortedIndexes.Select(Function(i) score(i)).ToList ' { 2, 4, 6 }
    

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 2012-10-31
      • 2011-03-29
      • 2018-04-17
      相关资源
      最近更新 更多