Wie Sortiere ich ein zwei-dimensional (eckig) - array in C#?
Ich habe ein zweidimensionales array (Strings), aus denen meine Daten Tabelle (Zeilen und Spalten). Ich möchte sozusagen das array nach einer Spalte. Ich habe versucht ein Algorithmus gefunden werden, für die dies in C#, haben aber nicht erfolgreich gewesen.
Jede Hilfe ist willkommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laden Sie Ihre zwei-dimensionalen string-array in einen eigentlichen DataTable (System.Daten.DataTable), und dann verwenden Sie die DataTable-Objekt Auswählen () - Methode generiert ein sortiertes array von DataRow-Objekten (oder verwenden Sie eine DataView für einen ähnlichen Effekt).
Könnten Sie auch schreiben Sie Ihre eigene Methode zum Sortieren eines zwei-dimensionalen Arrays. Beide Ansätze nützlich sein würde, Lernerfahrungen, aber das DataTable-Ansatz würde für den Anfang auf das lernen einen besseren Umgang mit Tabellen von Daten in einer C# - Anwendung.
Kann ich überprüfen, - meinst du ein rechteckiges array (
[,]
)oder ein verzweigtes array ([][]
)?Es ist ganz einfach zu Sortieren, ein verzweigtes array; ich habe eine Diskussion auf, die hier. Offensichtlich sind in diesem Fall die
Comparison<T>
würde eine Spalte statt der Sortierung nach Ordnungszahl - aber sehr ähnlich.Sortierung ein rechteckiges array ist etwas schwieriger zu beantworten... ich würde wohl versucht sein, Sie zu kopieren Sie die Daten entweder in einem rechteckigen array oder eine
List<T[]>
und Sortieren es, dann zurück kopieren.Hier ist ein Beispiel mit einem jagged array:
Für die Arbeit mit einem rechteckigen array... nun, hier ist etwas code, um ein Umschalten zwischen den beiden auf der fly...
y
dort)Hier ist ein archivierter Artikel von Jim Mischel mit ein bei InformIt, mit der Sortierung sowohl für eckige und zackige multi-dimensionale arrays.
Dieser code sollte das tun, was Sie nach, ich habe nicht verallgemeinert, es für n von n, aber das ist straight forward. Das sagte - ich Stimme mit MusiGenesis, mit einem anderen Objekt, das ein wenig besser geeignet (vor allem, wenn Sie Vorhaben zu tun jede Art von Bindung)
(Ich fand den code hier)
Kann allso schauen Array.Sort-Methode http://msdn.microsoft.com/en-us/library/aa311213(v=vs. 71).aspx
z.B. Array.Sortieren(array, delegate(object[] x, object[] y){ return (x[ i ] as IComparable).CompareTo(y[ i ]);});
vom http://channel9.msdn.com/forums/Coffeehouse/189171-Sorting-Two-Dimensional-Arrays-in-C/
Also das array ist wie folgt aufgebaut (ich bin gonna talk in pseudocode, da meine C#-fu ist schwach, aber ich hoffe, Sie bekommen das wesentliche, was ich sage)
So
value[1][3]
ist der Wert in Zeile 1, Spalte 3.Möchten Sie nach Spalte Sortieren, also das problem ist, dass das array ist um 90 Grad.
Als ein Erster Schnitt, konnte Sie nur drehen Sie es?
Wenn Sie wissen, dass Sie nur wollen, zu Sortieren, eine Spalte zu einem Zeitpunkt, könnten Sie diese optimieren, eine Menge von nur extrahieren der Daten, die Sie Sortieren möchten:
In C++ könnte man spielen tricks mit, wie Sie zu berechnen offsets in einem array (da könnte man behandeln Ihre zwei-dimensionalen array als ein one-d-array), aber ich bin mir nicht sicher, wie man das in c#.
Ausprobieren. Die grundlegende Strategie ist, um die Sortierung der bestimmten Spalte unabhängig und erinnere mich an die ursprüngliche Zeile des Eintrags. Der rest des Codes wird der Zyklus durch die sortierte Spalte Daten und tauschen Sie die Zeilen in das array. Der schwierige Teil ist remembing zu aktualisieren, die ursprüngliche Spalte als swap-Anteil wird effektiv verändern der ursprünglichen Spalte.
Könnte wenn Sie erhalten die Daten als ein generisches Tupel, wenn du es gelesen oder abgerufen, wäre es viel einfacher; dann wäre nur zu schreiben, eine Art Funktion, vergleicht die gewünschte Spalte des Tupels, und Sie haben ein eindimensionales array von Tupeln.
Dies ist eine alte Frage, aber hier eine Klasse, die ich gerade gebaut basierend auf der Artikel von Jim Mischel mit ein bei InformIt verbunden durch Doug L.
Gegeben eine unsortierte 2D-array
data
beliebiger Größe, die Sie möchten, zu Sortieren, die Spalte 5, die Sie nur dazu:Hinweis: der virtuelle
Compare
Methode und geschütztSortArray
so dass Sie erstellen können spezialisierte Unterklassen, die immer irgendwie auf eine bestimmte Spalte oder tun spezielle Sortierung über mehrere Spalten oder was auch immer Sie tun möchten. Das ist auch der Grund, warumCompareStrings
ist ausgebrochen und geschützt - jede Unterklassen können es verwenden, für einfache Vergleiche, anstatt aus dem vollenSortArray[x, col].CompareTo(SortArray[y, col])
syntax.Mag ich die DataTable Ansatz von MusiGenesis oben. Die nette Sache über es ist, dass Sie können Sie Sortieren, indem Sie alle gültigen SQL 'order by' - string, der verwendet den Spaltennamen, z.B. "x, y desc", "z" für die 'order by x, y desc' z'. (FWIW, ich konnte es nicht, um die Arbeit mit Spalte Ordnungszahlen, z.B. "3,2,1" für die 'order by 3,2,1'), die ich verwendet nur ganze zahlen, aber klar man könnte hinzufügen, gemischter Typ, die Daten in den DataTable und Sortieren Sie jeder Weise.
In dem folgenden Beispiel habe ich zuerst geladen, einige unsortierte integer-Daten in einem tblToBeSorted in der Sandbox (nicht gezeigt). Mit der Tabelle und deren Daten, die bereits bestehende lade ich es (unsortiert) in eine 2D-integer-Arrays, dann zu einer DataTable. Das array von DataRows ist die sortierte version der DataTable. Das Beispiel ist ein wenig seltsam, dass ich laden mein array aus der DB wäre und sortiert es dann, aber ich wollte nur um eine unsortierte array in C# zu verwenden, mit dem DataTable-Objekt.
Ich weiß, das ist spät, aber hier ist mein Gedanke, Sie würde vielleicht überlegen.
ist dies beispielsweise für die array
sowie Sie wollen, es zu konvertieren, von Spalte Nummer 2, dann
Herzlichen Glückwunsch, Sie haben sortiert das array nach der gewünschten Spalte. Diese können Sie ändern, damit es funktioniert mit anderen Datentypen