Dobrý den, snažím se setřídit pole tříd. Třída má vlastnosti norma(string),velikost(byte),šířka(single) Nejprve potřebuji setřídit pole podle norem(string) k tomu použiji:
Array.Sort(sortKeyString,pole)
(sortKeyString je pole stringů vytažené z pole tříd) To se setřídí vpořádku. Poté chci seřadit každou normu podle velikosti(byte) najdu si startovní index, lenght index každé normy a přes cyklus setřídit druhou část.
Array.Sort(sortkey, doors, startindex, indexOfLenght)
V mém případě jsou string normy dvě V prvním cyklu se pole s první normou seřadí správně hodnoty metody jsou: Array.Sort((15(lenght),33(lenght),0(start index),15(lenght)) Při druhém pruchodu cyklem jsou hodnoty: Array.Sort((18(lenght),33(lenght),15(start index),18(lenght)) a tady mi to vypíše chybu: Posun a délka jsou mimo hranice pole, nebo počet je větší než počet prvků počítaný od idexu po konec zdrojové kolekce. Nevím kde by mohla být chyba délka klíče a délka řazené části pole jsou si rovné 18 = 18, start index je také v pořádku a součet start indexu a délky řazené části nepřekročí celkovou velikost pole. (při druhém průchodu 15 + 18 = 33) Věděl by někdo kde dělám chybu ? Celý třídíci kód:
Private Sub sortArrayDoor()
Dim index As Integer = 0
Dim sortKeyString(0) As String
Dim poleNorem() As String
'ziska pole stringu s normamy - OK
For Each prvek As clsDoor In doors
ReDim Preserve sortKeyString(index)
sortKeyString(index) = prvek.Norma
index += 1
Next prvek
'Setřídí celé pole podle norem - OK
Array.Sort(sortKeyString, doors)
'Funkce načte stringové pole norem {CSN,DIN} - OK
poleNorem = clsHledani.HledejDvere(doors)
'Cyklus pro setřídění části pole se stejnou normou
For i As Integer = 0 To UBound(poleNorem)
index = 0
Dim startindex As Integer = startIndexNormy(doors,poleNorem(i))
Dim stopindex As Integer = stopIndexNormy(doors, poleNorem(i))
Dim indexOfLenght As Integer = lenghtIndex(doors, poleNorem(i))
Dim sortkey(0) As Byte
'Vyhledání sort key k cyklu - OK
For j As Integer = startindex To stopindex
ReDim Preserve sortkey(index)
sortkey(index) = doors(j).Velikost_Ramecku
index += 1
Next j
'Při druhém průchodu neprojde
Array.Sort(sortkey, doors, startindex, indexOfLenght)
'Array.Sort(sortkey, doors, startindex, indexOfLenght)
Next i
End Sub
'Nalezení start indext - OK
Private Function startIndexNormy(ByVal pole() As clsDoor, ByVal Norma As String) As Integer
For i As Integer = 0 To UBound(pole)
If pole(i).Norma = Norma Then
Return i
End If
Next i
End Function
'Nalezeni stop indexu - OK
Private Function stopIndexNormy(ByVal pole() As clsDoor, ByVal norma As String) As Integer
Dim index As Integer = 0
Dim nalezeno As Boolean = False
For i As Integer = 0 To UBound(pole)
If pole(i).Norma = norma Then
If Not nalezeno Then
index = i
nalezeno = True
End If
index += 1
End If
Next i
Return index - 1
End Function
'Vypočet lenght indexu - OK
Private Function lenghtIndex(ByVal pole() As clsDoor, ByVal norma As String) As Integer
Dim index As Integer = 0
For i As Integer = 0 To UBound(pole)
If pole(i).Norma = norma Then
index += 1
End If
Next i
Return index
End Function
|