Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  NX Programmierung
  Liste sortieren

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX
Autor Thema:  Liste sortieren (1383 / mal gelesen)
Klebe
Mitglied



Sehen Sie sich das Profil von Klebe an!   Senden Sie eine Private Message an Klebe  Schreiben Sie einen Gästebucheintrag für Klebe

Beiträge: 21
Registriert: 26.08.2014

erstellt am: 25. Aug. 2017 09:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


NX_Open_Bestellung_erstellen_bild1.jpg


NX_Open_Bestellung_erstellen_bild2.jpg

 
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


Sehen Sie sich das Profil von mseufert an!   Senden Sie eine Private Message an mseufert  Schreiben Sie einen Gästebucheintrag für mseufert

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Klebe 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von geraldb an!   Senden Sie eine Private Message an geraldb  Schreiben Sie einen Gästebucheintrag für geraldb

Beiträge: 38
Registriert: 13.09.2008

erstellt am: 25. Aug. 2017 17:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Klebe 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Klebe an!   Senden Sie eine Private Message an Klebe  Schreiben Sie einen Gästebucheintrag für Klebe

Beiträge: 21
Registriert: 26.08.2014

erstellt am: 28. Aug. 2017 06:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Guten Morgen,

Danke für Deinen Hinweis und Tip Michael.
geraldb genau das habe ich gesucht. Vielen Dank für die Mühe.
Deine Antwort ist wirklich sehr präzise und hilfreich.

Viele Grüsse,
Alfred

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Klebe
Mitglied



Sehen Sie sich das Profil von Klebe an!   Senden Sie eine Private Message an Klebe  Schreiben Sie einen Gästebucheintrag für Klebe

Beiträge: 21
Registriert: 26.08.2014

erstellt am: 29. Aug. 2017 10:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


NX_Open_Bestellung_erstellen_bild3.jpg

 
Hallo,

danke für eure Hilfe.
Es hat jetzt geklappt.
Im Anhang meine umgesetzte Lösung.
Vielleicht kann's ja mal jemand gebrauchen.

Viele Grüsse,
Alfred

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mseufert
Moderator
Freiberuflicher CAD/CAM Ingenieur


Sehen Sie sich das Profil von mseufert an!   Senden Sie eine Private Message an mseufert  Schreiben Sie einen Gästebucheintrag für mseufert

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Klebe 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von geraldb an!   Senden Sie eine Private Message an geraldb  Schreiben Sie einen Gästebucheintrag für geraldb

Beiträge: 38
Registriert: 13.09.2008

erstellt am: 29. Aug. 2017 22:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Klebe 10 Unities + Antwort hilfreich

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



CAD-Konstrukteur (m/w/d)
<...
Anzeige ansehenKonstruktion, Visualisierung
mseufert
Moderator
Freiberuflicher CAD/CAM Ingenieur


Sehen Sie sich das Profil von mseufert an!   Senden Sie eine Private Message an mseufert  Schreiben Sie einen Gästebucheintrag für mseufert

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Klebe 10 Unities + Antwort hilfreich

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz