2016-08-24 15 views
0

私は2つのリスト、1つの整数と1つのストリングを持っています。これらの値は、ループ中に入力されるので、それらは一緒に関連付けられます(例えば、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 
+0

私は[** '(TKEY、TValueの)辞書' **](https://msdn.microsoft.com/en-us/library/xfhwa508(V = vs.110)だと思います。 aspx)はここで便利です。または、より良い[** 'SortedDictionary(Of TKey、TValue)' **](https://msdn.microsoft.com/en-us/library/f7fta44c(v=vs.110).aspx)。 –

+0

**密接に関連する**データをパラレルコレクションに格納するのではなく、クラスを使用してください:[5分ガイドクラスとリスト](0120-912-0111) – Plutonix

答えて

0

あなたが別のオブジェクトにあなたの文字列と整数をラップする必要があります。

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 

あなたはあなたのコードを提供する場合、我々はより多くのあなたを助けることができます。

+0

残念ながら、私のコードは遠い実行するには大きすぎます。私は汎用リストを使用していて、For ... Nextループを使用してリストに項目を追加しています。 – AParkInTheWalk

+0

次に、問題を孤立した例で示すためにコードを単純化する必要があります。 –

+0

私はコードの抜粋を簡略化して追加しました。上記のテキストボックスには、最終結果の名前とスコアが含まれている必要があります。 – AParkInTheWalk

0

名前のソート方法はいくつかあります。 1つの方法があります:

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 } 
1

コンテナクラスまたはディクショナリを使用する他の方法によって提案された手法は、より良い解決策です。しかし、質問に答えようとするなら、あなたがしようとしているのは、キー付きの並べ替えを実行することです。残念ながら、List(Of T)クラスはこの機能を提供しません。それはArray Classによって提供されます。

これは、最初に2つのリストを配列にダンプし、配列をソートし、最後にソートされた結果でリストを再作成するので、ちょっと複雑です。

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) 
関連する問題