mikrocontroller.net

Forum: PC-Programmierung [c#] COM-Port-Auswahl in ComboBox alphabetisch sortierten / Dateien sortieren


Autor: Rainer Spam (cubi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


Ich habe eine ComboBox in der ich die verfügbaren COM-Ports 
(WinXP/.NET/C#) zur Auswahl darstellen kann.
comboBox1.ItemsSource =  SerialPort1.GetPortNames();

Zum alphabetischen Sortieren habe ich jetzt ein List-Objekt dazwischen 
geschaltet in dem ich die Sortierung vornehme.

List <string>  list_comport = new List <string> (SerialPort.GetPortNames());
list_comport.Sort();

comboBox1.ItemsSource = list_comport;



Das Sortieren funktioniert jetzt zwar nach den typischen 
Sortier-Algorithmus, aber die Ausgabe ist diese:

COM1
COM18
COM19
COM2
COM20
COM4
COM5



Wie ist es diese Sortier-Ausgabe herzustellen ?

COM1
COM2
COM4
COM5
COM18
COM19
COM20


Bei Datei-Listen u.ä. wird dieses Problem auch bestehen.

Ich bin absolut neu auf dem Feld der Programmierung und habe kaum 
Erfahrung.
Wenn jemand ein paar Hinweise geben könnte, wie man dies 
bewerkstellingen könnte, würde ich mich sehr freuen.

Gruß


Cubi

Autor: Chris ... (dechavue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibs sicher schönere Lösungen (die hier funktioniert nur wenn 3 gleiche 
Zeichen gefolgt von der Nummer nach der sortiert werden soll vorhanden 
sind) aber für Com-Ports sollte es ausreichend sein.
List<string> ports = new List<string>() {
  "COM1",
  "COM18",
  "COM2",
  "COM19",
  "COM20",
  "COM4",
  "COM5"};

ports.Sort(new Comparison<string>(delegate(string a, string b) {
  return int.Parse(a.Substring(3)) -
         int.Parse(b.Substring(3));
}));

 

Autor: Rainer Spam (cubi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
" Wie Geil !!!!!! "

Sorry ,  das war mein Ausspruch nachdem es funkionierte.

Vielen Dank für den Code dechavue.

Ich habe den Code noch nicht richtig verstanden, aber diese Zeilen 
zeigen mir , daß  ich die Kapitel über parse noch einmal durchlesen muß.
//



Im Internet habe ich nur solche Lösungen gefunden in denen geraten wurde
führende Nullen zu verwenden.
Wenn jemand noch eine Universallösung, die mit allen Zeichenketten zu 
recht kommen würde kennt, nur her damit.

Gruß

Cubi

Autor: Chris ... (dechavue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Etwas verständlicher sieht das Ganze wahrscheinlich in der Form aus:
List<string> ports = new List<string>() {
  "COM1",
  "COM18",
  "COM2",
  "COM19",
  "COM20",
  "COM4",
  "COM5"};

ports.Sort(new Comparison<string>( ComparePortStrings  ));

...



//returns:
// a  < b --> return < 0
// a == b --> return = 0
// a  > b --> return > 0 
private int ComparePortStrings (string a, string b) {
  return int.Parse(a.Substring(3)) -
         int.Parse(b.Substring(3));
}

Man kann der Sort-Methode eine Methode die zum Vergleichen verwendet 
wird mitgeben (ähnlich einem Prädikat/Funktor in der STL in C++)

Ist vom Prinzip genau das Gleiche wie die erste Variante, nur dass in 
der vorherigen Variante eine anonyme Methode verwendet wurde.

Das Parse macht nur aus dem String (hier ab Index 3) einen Integer. 
Durch die Subtraktion erhält man gleich das passende Ergebnis für die 
Compare-Methode.

Hier noch eine etwas allgemeinere Variante der Compare-Methode:
 
Regex rexNum =new Regex(@"(?<Text>^.+?)(?<Num>\d+)?(?<Ext>\.[^\.]+)?$", RegexOptions.Compiled);
Match mA = rexNum.Match(a);
Match mB = rexNum.Match(b);

if(mA.Success && mB.Success &&
   mA.Groups["Num"].Success && mB.Groups["Num"].Success &&
   mA.Groups["Text"].Value == mB.Groups["Text"].Value]) {
    return int.Parse(mA.Groups["Num"].Value) -
           int.Parse(mB.Groups["Num"].Value);
}
return a.CompareTo(b);
Hier wir wenn die Nummer als letztes (vor einer eventuellen 
Dateierweiterung) steht und der Text davor gleich ist die Nummer 
verglichen, sonst der Text nach dem Standard-Stringvergleich.

Aber Achtung, die Neue Variante ist großteils ungetestet.

Autor: Rainer Spam (cubi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für Deine Mühe Chris.

Diese Codes helfen mir sehr weiter.

Gruß


Cubi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.