| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: Liste sortieren (1384 / mal gelesen)
|
Klebe Mitglied
Beiträge: 21 Registriert: 26.08.2014
|
erstellt am: 25. Aug. 2017 09:07 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen zusammen, gerade arbeite ich daran von NX aus eine Graphit- Bestellung für Graphit- Elektroden zu erstellen. In der Firma erstellen wir Elektroden mit dem Electrode- Design. Ich lese die erstellten Elektroden von NX in eine List(of cls_Ele). Wobei cls_Ele eine selbst erstellte Klasse ist. Diese Liste möchte ich sortieren um daraus die Bestellung zu erstellen. Nach einer Eigenschaft kann ich die Liste sortieren. Aber ich möchte die Liste zuerst nach Laenge, dann nach Breite, dann nach Hoehe sortieren. Mit Linq klappt es bei NX auch nicht (ich arbeite mit NX9). Weiss jemand einen Rat? Schon mal besten Dank für eure Hilfe.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 25. Aug. 2017 14:56 <-- editieren / zitieren --> Unities abgeben: Nur für Klebe
Hallo Klebe, schau' Dir mal das Interface IComparer und die Funktion Compare an, damit sollte das gehen. Gruß, Michael ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit seltner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geraldb Mitglied
Beiträge: 38 Registriert: 13.09.2008
|
erstellt am: 25. Aug. 2017 17:11 <-- editieren / zitieren --> Unities abgeben: Nur für Klebe
Hallo Klebe, da die drei Werte Länge, Breite und Höhe als Krterium dienen wirst Du einen eigenen Schlüssel erstellen müssen. Meine Musterklasse cls_Ele mit einer eigenen GetSortKey-Funktion. Innerhalb dieser muß man ggf. noch die Genauigkeit (Zeichenanzahl in PadLeft) anpassen.
Code:
Public Class cls_Ele Public m_Name As String = "" Private m_BA As String = "" Private m_Laenge As Single = 0.0 Private m_Breite As Single = 0.0 Private m_Hoehe As Single = 0.0 Public Sub New(ByVal Name As String, ByVal BA As String, ByVal Laenge As Single, ByVal Breite As Single, ByVal Hoehe As Single) m_Name = Name m_BA = BA m_Laenge = Laenge m_Breite = Breite m_Hoehe = Hoehe End Sub Public Function GetSortKey() As String Return m_Laenge.ToString().PadLeft(20, "0"c) & "_" & m_Breite.ToString().PadLeft(20, "0"c) & "_" & m_Hoehe.ToString().PadLeft(20, "0"c) End Function End Class
Eine eigene Klasse zum Vergleich
Code:
Public Class cls_EleComparer Implements IComparer(Of cls_Ele) Public Function Compare(x As cls_Ele, y As cls_Ele) As Integer Implements System.Collections.Generic.IComparer(Of cls_Ele).Compare Return x.GetSortKey.CompareTo(y.GetSortKey) End Function End Class
Meine beispielhaft gemischte Liste von ele-Elementen
Code:
elelist.Add(New cls_Ele("Ele1", "", 100, 100, 100)) elelist.Add(New cls_Ele("Ele2", "", 200, 100, 100)) elelist.Add(New cls_Ele("Ele3", "", 100, 100, 200)) elelist.Add(New cls_Ele("Ele4", "", 100, 200, 100)) elelist.Add(New cls_Ele("Ele5", "", 100, 100, 100)) elelist.Add(New cls_Ele("Ele6", "", 600, 500, 100)) elelist.Add(New cls_Ele("Ele7", "", 600, 100, 100)) elelist.Add(New cls_Ele("Ele8", "", 200, 200, 100)) elelist.Add(New cls_Ele("Ele9", "", 200, 100, 200))
wird sortiert mit
Code:
elelist.Sort(New cls_EleComparer)
Wichtig: eine nachfolgende Schleife zum Auslesen darf nicht ForEach sein, da diese wahlfrei zugreift. Hier muß stattdessen mit einem Index zugegriffen werden.
Code:
Dim eletext As String = "" For i As Integer = 0 To elelist.Count - 1 Dim ele As cls_Ele = elelist(i) eletext = eletext & vbCrLf & ele.m_Name & ":" & ele.GetSortKey() Next
Ergebnis der Sortierung (Reihenfolge innerhalb der Ele-Liste) mit Name und Key
Code:
Ele5:00000000000000000100_00000000000000000100_00000000000000000100 Ele1:00000000000000000100_00000000000000000100_00000000000000000100 Ele3:00000000000000000100_00000000000000000100_00000000000000000200 Ele4:00000000000000000100_00000000000000000200_00000000000000000100 Ele2:00000000000000000200_00000000000000000100_00000000000000000100 Ele9:00000000000000000200_00000000000000000100_00000000000000000200 Ele8:00000000000000000200_00000000000000000200_00000000000000000100 Ele7:00000000000000000600_00000000000000000100_00000000000000000100 Ele6:00000000000000000600_00000000000000000500_00000000000000000100
Leider hast Du nicht angegeben ob die Werte auf- oder absteigend sortiert werden sollen. Mein Code führt dies aufsteigend durch. Soll nun absteigend sortiert werden bleiben 4 Möglichkeiten: a) den Vergleichsalgorithmus anpassen
Code: Return y.GetSortKey.CompareTo(x.GetSortKey)
b) den Vergleichsalgorithmus anpassen Code: Return x.GetSortKey.CompareTo(y.GetSortKey) * -1
c) beim Auslesen die Reihenfolge umkehren Code: For i As Integer = elelist.Count - 1 To 0 Step -1
d) die sortierte Liste nach dem Sortieren nochmal "umdrehen" Code:
elelist.Sort(New cls_EleComparer) elelist.Reverse()
Dein Problem sollte damit gelöst sein, Unities sind gern gesehen. [Diese Nachricht wurde von geraldb am 25. Aug. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Klebe Mitglied
Beiträge: 21 Registriert: 26.08.2014
|
erstellt am: 28. Aug. 2017 06:49 <-- editieren / zitieren --> Unities abgeben:
|
Klebe Mitglied
Beiträge: 21 Registriert: 26.08.2014
|
erstellt am: 29. Aug. 2017 10:16 <-- editieren / zitieren --> Unities abgeben:
|
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 29. Aug. 2017 18:57 <-- editieren / zitieren --> Unities abgeben: Nur für Klebe
Zitat: Original erstellt von geraldb:Wichtig: eine nachfolgende Schleife zum Auslesen darf nicht ForEach sein, da diese wahlfrei zugreift. Hier muß stattdessen mit einem Index zugegriffen werden.
Hallo geraldb, der Aussage würde ich zunächst widersprechen. Hast Du ein Beispiel, bei dem tatsächlich Unterschiede in der Reihenfolge auftreten ? Gruß, Michael
------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit seltner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geraldb Mitglied
Beiträge: 38 Registriert: 13.09.2008
|
erstellt am: 29. Aug. 2017 22:38 <-- editieren / zitieren --> Unities abgeben: Nur für Klebe
Hallo Michael, das wahlfreie Verhalten habe ich mit diversen Collectiontypen erlebt. Ob es dabei ausschließlich auf <SortedList>, <Dictionary> u.a. oder umfangreiche Listen zutraf kann ich nicht explizit sagen. Auffällig ist bspw. dass
Code:
For Each comp As NXOpen.Assemblies.Component In workPart.ComponentAssembly.GetChildren() ... Next
in meinen Versuchen meist mit dem letzten Element im Strukturbaum beginnt und sich nach oben hin durcharbeitet anstatt wie erwartet von oben nach unten zu gehen. Weiteres Beispiel im SQL Server Management Studio: eine Abfrage a la Code:
SELECT * FROM Namen
liefert diese nicht zwangsweise in Reihenfolge eines vorhandenen PrimaryKeys (NameID) sondern stellenweise bunt gemischt. Insofern ist es für Collections, bei denen es auf die Reihenfolge ankommt ratsam, diese mittels Index auszulesen. So kann man die Reihenfolge selbst vorherbestimmen, unabhängig von der Collection-internen Implemetierung. Gruß Gerald [Diese Nachricht wurde von geraldb am 29. Aug. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Electrical System Engineer (m/w/d) | Als globales Unternehmen mit Tradition sind wir einer der führenden Hersteller von Ventilatoren und lufttechnischen Systemen. Mit unseren rund 500 Mitarbeitern weltweit bieten wir durch langjähriges fachspezifisches Wissen und unser starkes Teamwork kundenorientierte, innovative Produkte und Dienstleistungen an. Das macht uns zu einem kompetenten und verlässlichen Lösungsanbieter von Ventilatoren ... | Anzeige ansehen | Elektrotechnik, Elektronik |
|
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 30. Aug. 2017 08:30 <-- editieren / zitieren --> Unities abgeben: Nur für Klebe
Hallo geraldb, bei Baugruppen ist das plausibel. [Component].GetChildren() greift, wie auch immer, auf das NX-Part zu und sucht die entsprechenden Elemente heraus. In welcher Reihenfolge sie da drin stehen bzw. ausgelesen werden, steht ohnehin in den Sternen. Die Reihenfolge ist sehr wahrscheinlich nicht sortiert, zunächst evtl. abhängig davon, wann der User eine Komponente eingefügt hat. Spätestens wenn eine Komponente z.B. per Cut/Copy/Paste bearbeitet wird, dürfte eine vorhandene Reihenfolge sowieso futsch sein. Selbst befüllte Collections haben mir bisher nie Schwierigkeiten bereitet, Sollte das mal der Fall sein, fällt mit hoffentlich dieser Beitrag wieder ein Gruß, Michael ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit seltner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|