Autor Beitrag
Määx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Fr 21.03.14 11:45 
Hallo zusammen,

ich habe ein Problem mit der Sortierung von meinen Daten. Diese kommen ursprünglich zwar aus einer Datenbank (Entityframework, Linq) aber denke es passt trotzdem am besten an diese Stelle...
Also ich habe eine Spalte mit strings, die wie folgt aussehen können: "10", "hallo", "5m", "1" . Lasse ich dies nun normal aus/absteigend sortieren, erhalte ich etwas wie: "1", "10", "5m", "hallo". Nun möchte ich aber "1", "5m", "10", "hallo" als Ergebnis erhalten... Ist sowas möglich? also quasi die string zunächst numerisch betrachten...

Bin für eure Hilfe wiedermal dankbar!!
Määx
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 21.03.14 12:03 
Zitat:
Ist sowas möglich? also quasi die string zunächst numerisch betrachten...


Du hast es doch schon beschrieben. Sortiere zuerst nach dem numerischen Teil (also mußt du denn aus dem string erstmal extrahieren damit du danach sortieren kannst) und dann nach dem Rest.

ausblenden C#-Quelltext
1:
2:
var list = new [] { "10""hallo""5m""1" };
var sorted = list.OrderBy(x => new string(x.TakeWhile(y => Char.IsDigit(y)).ToArray())).ThenBy(z => new string(z.SkipWhile(c => Char.IsDigit(c)).ToArray()));


Aber die genaue Definition deiner Sortierung solltest du dir überlegen und festlegen. Wenn du zuerst numerisch sortieren willst hat "hallo" keinen numerischen Wert. Nichts ist immer kleiner als irgendeine Zahl. "hallo" kommt nach dieser Definition also zuerst. Anders als du es in deinem Beispiel gezeigt hast. Heißt deine Beschreibung passt nicht zu deinem Beispiel.
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 21.03.14 12:09 
Ja, klar ist das möglich.

Ich würde eine eigene Vergleichsfunktion schreiben, die den Anfang des Strings auf Ziffern überprüft. Falls in beiden Strings Ziffern enthalten sind, kannst du diese vergleichen. Falls nur in einem Ziffern sind, 1 oder -1 zurück geben. Sind in beiden Strings keine Ziffern am Anfang, dann auf den string-Vergleich zurückgreifen.

Vielleicht hilft dir auch dieses hier weiter: stackoverflow.com/a/248613/1974021 Die Leute von Microsoft haben sich da ja auch mal Gedanken gemacht, wie Dateien im Explorer sortiert werden sollten.
Määx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Fr 21.03.14 12:53 
super danke, genau das dort gefunden was ich gesucht hab!
Genutzt habe ich zwar nicht die Lösung von MS, aber diese hier war dort auch verlinkt:
zootfroot.blogspot.d...th-linq-orderby.html

Danke!