2015-11-11 4 views
0

Я пытаюсь сортировать список объектов по свойству date, но даты не упорядочены правильно. Я попытался передать их в массив и использовать Array.Sort, и я также попытался передать их в список и используя List.OrderBy(Function(x) x.requestClose), где свойство requestClose - это дата, но я получаю тот же результат.vb.net Сортировка дат

Например, у меня есть следующие даты:

11/9/2015, 
11/20/2015, 
11/10/2015 

То, что я хочу, это список, чтобы быть организованы как:

11/9/2015, 
11/10/2015, 
11/20/2015 

но то, что я получаю:

11/10/2015, 
11/20/2015, 
11/9/2015 

Дата собственности объявлена ​​как:

Public requestClose As Date 

, а затем использовать с:

DateTime.TryParse(formAddEquip.dtpCxDate.Value, newEquip.requestClose) 

Я был в состоянии заставить его работать, создавая отдельный вид, в частности, для случая, когда сортировка по дате. Проблема, о которой говорили люди, заключается в том, что keyArray() присваивается строка, а не дата. Есть ли удобный способ объявить этот массив, чтобы он не вызывал то, что по сути является той же подпрозой, которая отличается только типом переменной массива?

Public Sub dateSort() 
    Dim thisEquipList As New classEquipCollection 
    thisEquipList.Clear() 

    Dim keyArray() As Date 'THIS IS WHERE IT WAS PREVIOUSLY DECLARED A STRING; string sorting is still needed for other sorting, such as by equip.name 
    ' 
    ReDim keyArray(0 To project.equipList.Count - 1) 
    'create an array of the search terms 

    For i = 1 To project.equipList.Count 
     keyArray(i - 1) = project.equipList(i - 1).requestClose 
    Next 

    Array.Sort(keyArray) 

    'remove duplicats in the key array 
    Dim dupeFound As Boolean 
    Dim newKeyArray() As String 
    ReDim newKeyArray(0 To 0) 
    Dim noDupeIndex As Integer 
    'new key array holds only non-duplicates 
    For i = 0 To UBound(keyArray) 
     dupeFound = False 
     For j = (i + 1) To UBound(keyArray) 
      If keyArray(j) = keyArray(i) Then 
       dupeFound = True 
      End If 
     Next j 
     'if a unique key, add it to the non-duplicate array 
     If dupeFound = False Then 
      ReDim Preserve newKeyArray(0 To noDupeIndex) 
      newKeyArray(noDupeIndex) = keyArray(i) 
      noDupeIndex = noDupeIndex + 1 
     End If 

    Next i 
    'match the equipment item to the search term and 
    For i = 0 To UBound(newKeyArray) 
     For Each item In project.equipList 
      If newKeyArray(i) = item.requestClose Then 
       thisEquipList.Add(item) 
      End If 
     Next 
    Next 
    'now that the list is sorted, assign it to project equiplist 
    project.equipList.Clear() 
    For i = 0 To thisEquipList.Count - 1 
     project.equipList.Add(thisEquipList(i)) 
    Next 

End Sub 
+1

Каков тип данных 'dateProperty'? Это строка? Если да, сделайте вместо этого «дату». –

+1

Вам нужно показать код - похоже, что они не являются фактическими типами даты, но строки («9» больше, чем «10»). [Изменить] ваше сообщение, не добавляйте код в комментарии. – Plutonix

+0

Я считаю, что они корректно отображаются как типы даты. Я использовал DateTime.TryParse (formAddEquip.dtpCxDate.Value, newEquip.requestClose) – coolhand

ответ

1

Старых сейчас, но появился сегодня в безответном зрении, и весь метод может быть значительно упрощено:

Public Sub dateSort() 
    project.equipList = project.equipList.OrderBy(Function(e) e.requestClose). 
          GroupBy(Function(e) e.requestClose). 
          Select(Function(g) g.First()). 
          ToList() 
End Sub 

При этом предполагается, что операторы .NET в Linq все используют устойчивые сорта и процессов, которые сохранят первоначальный порядок. Я считаю, что в настоящее время это так, но это не всегда было так и, хотя и оставалось неизменным в обозримом будущем, могло измениться снова. Если стабильные сортировки не могут быть гарантированы, вам может потребоваться добавить дополнительный .OrderBy() в пределах Select(), чтобы обеспечить выбор правильного товара, а затем переместить основной OrderBy() после Select().

0

При использовании OrderBy Extension Method, вы должны убедиться, что вы используете набор результатов, чтобы увидеть правильный порядок.

Dim lstSortedList As List(Of YourObject) = lstOriginal.OrderBy(Function(objTarget) objTarget.requestClose).ToList() 
Смежные вопросы