blueye89 Ответов: 2

Как отсортировать элементы списка по значению в середине элемента списка


Всем привет,
Я понятия не имею, как сортировать элементы списка по какому-то числу в середине текста.
Например, мой listbox заполнен списком элементов в следующем формате::
ListBox1.Items.Add("Plate: " & oPlateName & "; Angle: - " & strAngle & "; Diameter: " & strDiameter)


И список должен быть отсортирован по значению:
strAngle

который находится где-то в середине элемента списка.

Любая помощь очень ценится.
ТЗ

Что я уже пробовал:

То, что я пробовал, это:

Dim orderedList As List(Of String) = (From item In myList Order By Integer.Parse(item.Substring(item.IndexOf("; Angle: - ") + 1)) Descending Select item).ToList

Richard MacCutchan

И что произошло, когда вы попробовали этот код?

Michael_Davies

Какой результат вы получаете в orderedList, соответствует ли он вашим ожиданиям и если да, то что не так.

Редко используйте listbox, предпочитайте ListView, установленный в detailed, и добавьте обработчик для сортировки, чтобы он сортировался по мере добавления элементов в список или отключения сортировки, построения списка, а затем сортировки.

Michael_Davies

Почему бы не использовать ListView в детальном режиме добавить столбец для каждого элемента Plate, Angle & Diameter, а затем установить сортировку по столбцу Angle.

2 Ответов

Рейтинг:
14

Lockwood

Это WinForms? Если да, то вы можете сделать это:

Public Class PlateItem
    Public Plate As String
    Public Angle As Decimal
    Public Diameter As Decimal
    Public Overrides Function ToString() As String
        Return "Plate: " & Plate & "; Angle: - " & Angle & "; Diameter: " & Diameter
    End Function
End Class

'In your function
Dim plateItems As New List(Of PlateItem)
'Loop through items to add
plateItems.Add(New PlateItem with {.Plate = oPlateName, .Angle = strAngle, .Diameter = strDiameter})
'Finish Adding
lstPlateList.Items.AddRange(plateItems.OrderBy(Function(p) p.Angle).ToArray) 'This line had an error. Fixed.


Это также позволит вам вытащить объект PlateItem из lstPlate.SelectedItem, из которого вы можете вытащить угол и диаметр, не нуждаясь в манипуляциях со струной


Рейтинг:
12

blueye89

Я сделал это, разделив строку. Вот решение.

'Sorting by Angle
  Dim items = (From item In lstPlateList.Items
               Let parts = item.ToString.Split(New String() {"; Angle: - ", "; Diameter: "}, StringSplitOptions.None)
               Order By CInt(parts(1))
               Select item).ToArray
  lstPlateList.Items.Clear()
  lstPlateList.Items.AddRange(items)