2013-11-13 5 views
0

Я нашел и модифицировал приведенный ниже код, который хорошо работает, но нуждается в дополнительной модификации, которую я не могу вычислить. Я хочу, чтобы он сортировался произвольно в пределах одного и того же значения. В основном, что я хочу сделать, это случайным образом сортировать все, а затем группировать (или перечислить) все по стоимости в желаемом порядке. Например, у вас будет имя и значение, но это может выглядеть так. Имя 2, имя 2, имя 2, имя 3, имя 4, имя 4, имя 4, имя 5, имя 8, имя 8 и т. Д. До того, как оно закончится, я мог бы иметь около 500 имен с примерно 8 0r 9 разных значений При этом около 90 имен в каждой группе значенийКак отсортировать массив по подклассу

 Public Class Form1 

Dim ListOfValues As New List(Of List(Of String)) 
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Me.txtA1.Focus() 
End Sub 

Private Sub AddTB(row As Integer, column As Integer, start As Char) 
    Dim tb As New TextBox 
    Dim offset As Integer = Math.Sign(Asc(start) - 65) * (100 + tb.Width * 3) 
    tb.Name = "txt" & Chr(row + Asc(start)) & column.ToString 
    tb.Text = tb.Name 
    tb.Location = New Point(((column - 1) * tb.Width) + offset, (row * tb.Height)) 
    Me.Controls.Add(tb) 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Button1.Enabled = True 
    For I = 0 To 9 
     ListOfValues.Add({Me.Controls("txt" & Chr(I + 65) & "1").Text, _ 
          Me.Controls("txt" & Chr(I + 65) & "2").Text}.ToList) 

    Next 
    ListOfValues = ShuffleInfo(ListOfValues) 
    'This fills the other textboxes with the data from the shuffled list 
    For I = 0 To 9 
     Me.Controls("txt" & Chr(I + 77) & "1").Text = ListOfValues(I)(0) 
     Me.Controls("txt" & Chr(I + 77) & "2").Text = ListOfValues(I)(1) 

    Next 
End Sub 

Private Function ShuffleInfo(ValuesToShuffle As List(Of List(Of String))) As List(Of List(Of String)) 
    'this follows the same basic routine you were using, swapping each item with a random item. 
    Dim rand As New Random(Now.Millisecond) 

    For counter = 0 To ValuesToShuffle.Count - 1 
     Dim n = rand.Next(counter + 1) 
     Dim temp As List(Of String) = ValuesToShuffle(counter) 
     ValuesToShuffle(counter) = ValuesToShuffle(n) 
     ValuesToShuffle(n) = temp 
    Next 
    ShuffleInfo = ValuesToShuffle 
    Button1.Enabled = False 
End Function 
End Class 

enter image description here

ответ

1

LINQ это удобно здесь. Смотрите, если это помогает:

заменить эту строку:

ListOfValues = ShuffleInfo(ListOfValues) 

С этой линией:

ListOfValues = (From data In ShuffleInfo(ListOfValues) 
        Order By data(1) Descending).ToList 

Это будет группа список по второму элементу каждого элемента в списке, но сохранить произвольный случай в каждой группе.

От чего-то вроде этого:

C 3 
B 1 
C 1 
B 2 
C 2 
A 3 
A 2 
B 3 
A 1 

Вы получаете это:

C 3 
A 3 
B 3 
B 2 
C 2 
A 2 
B 1 
C 1 
A 1 
+0

Я не могу показаться, чтобы получить эту работу для меня. Я бы добавил его в массив shuffle, т. Е. Частную функцию –

+0

Я отредактировал свой ответ, чтобы сделать его понятным – tinstaafl

Смежные вопросы