C # Sortierbare Sammlung, die doppelte Schlüssel erlaubt
Schreibe ich ein Programm um eine Sequenz, in der verschiedene Objekte erscheinen im Bericht.
Die Folge ist die Y-position (Zelle) in Excel-Arbeitsblatt.
Einem demo-Teil von code ist unten.
Was ich erreichen möchte, ist eine Sammlung, die es mir ermöglichen, mehrere Objekte, und ich kann eine geordnete Sammlung, basierend auf der Sequenz
SortedList list = new SortedList();
Header h = new Header();
h.XPos = 1;
h.name = "Header_1";
list.Add(h.XPos, h);
h = new Header();
h.XPos = 1;
h.name = "Header_2";
list.Add(h.XPos, h);
Ich weiß, dass die SortedList-nicht zulassen und ich habe die Suche nach alternativen. Ich will nicht beseitigen die Duplikate und bereits versucht List<KeyValuePair<int, object>>
.
Dank.
InformationsquelleAutor der Frage Mayur Kotlikar | 2011-04-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie Ihre eigenen IComparer!
Wie schon in einigen anderen Antworten, Sie sollten Ihren eigenen comparer-Klasse. Für diesen Zweck verwende ich ein generisches IComparer-Klasse, das funktioniert mit allem, was implementiert IComparable:
Sie verwenden, wenn die Instanziierung einer neuen SortedList, SortedDictionary etc:
Hier int der Schlüssel ist, werden doppelte.
InformationsquelleAutor der Antwort Knasterbax
Können Sie sicher verwenden List<> . Die Liste hat eine Art Methode , eine überlastung, die IComparer akzeptiert. Sie können erstellen Sie Ihre eigenen sorter-Klasse als . Hier ist ein Beispiel :
InformationsquelleAutor der Antwort Dipti Mehta
Einfachste Lösung (im Vergleich zu all den oben genannten):
SortedSet<T>
es nimmt eineIComparer<SortableKey>
Klasse, dann implementieren Sie die Methode Vergleichen so:InformationsquelleAutor der Antwort knocte
Benutze ich folgende:
Meinem test-Fall:
Die Ausgabe:
InformationsquelleAutor der Antwort user450
Das problem ist, dass die Daten-Struktur-design entsprechen nicht der Anforderungen: Es ist notwendig, zu speichern, mehrere Zeilen für die gleiche XPosition. Daher
SortedList<XPos, value>
sollte nicht haben einen Wert vonHeader
aber ein Wert vonList<Header>
. Es ist eine einfache und kleine Veränderung, aber es löst alle Probleme und vermeidet die Schaffung neuer Probleme wie die anderen vorgeschlagenen Lösungen (siehe Erläuterung unten):Bitte beachten Sie, dass das hinzufügen ein "lustiges" - Taste, wie das hinzufügen einer Zufallszahl oder vorgibt, dass 2 XPos mit dem gleichen Wert unterschiedlich sind, führen zu viele andere Probleme. Zum Beispiel wird es schwierig oder sogar unmöglich zu entfernen, die einen bestimmten Header.
Beachten Sie auch, dass die Sortier-Leistung ist viel besser, wenn nur wenige
List<Header>
werden sortiert als jederHeader
. Beispiel: Wenn es 100 XPos und jeder hat 100 Header, 10000Header
müssen sortiert werden, im Gegensatz zu 100List<Header>
.Natürlich, auch diese Lösung hat einen Nachteil: Wenn es viele XPos mit nur 1 Header, wie viele Listen erstellt werden müssen, ist ein gewisser Aufwand.
InformationsquelleAutor der Antwort Peter Huber
Vielen Dank für deine Hilfe. Während der Suche mehr, ich fand diese Lösung. (Verfügbar in Stackoverflow.com in der anderen Frage)
Zuerst habe ich eine Klasse angelegt, die Kapseln würde meine Objekte für Klassen (Header,Footer etc)
Also diese Klasse soll halten Sie auf die Objekte, und PosX von jedem Objekt geht als int Position
Was schließlich bekomme ich das sortiert "Sequenz" - Liste.
InformationsquelleAutor der Antwort Mayur Kotlikar
Dieser Sammlung Klasse halten Duplikaten und legen Sie die Sortierreihenfolge für das doppelte. Der trick: versehen Sie die Elemente mit einem eindeutigen Wert
Sie sind eingefügt, um eine stabile Sortierung um. Dann Verpacken wir es in eine
ICollection-Schnittstelle.
einer test-Klasse
Die tagging-Struktur
Lambda-comparer Helfer
InformationsquelleAutor der Antwort bradgonesurfing
Haben Sie versucht
Lookup<TKey, TElement>
erlauben, der doppelte Schlüsselhttp://msdn.microsoft.com/en-us/library/bb460184.aspx
InformationsquelleAutor der Antwort Nasmi Sabeer
Das problem ist, dass Sie so etwas wie der Schlüssel, der kein Schlüssel (Ursache es tritt mehrere Male).
Also, wenn Sie die realen Koordinaten sollten Sie vielleicht nehmen Sie die
Punkt
als Schlüssel für Ihre SortedList.Oder erstellen Sie eine
List<List<Header>>
wo Sie Ihre erste Liste index legt die x-position und die innere-Liste-index der y-position (oder Umgekehrt, wenn Sie möchten).InformationsquelleAutor der Antwort Oliver
Erstellen Sie eine Klasse und die Abfrage der Liste:
InformationsquelleAutor der Antwort Satty FL
Linq -.Lookup ist cool und alles, aber wenn Ihr Ziel ist es, einfach eine Schleife über die "keys", während so dass Sie dupliziert werden, können Sie diese Struktur verwenden:
Dann können Sie schreiben:
HTH
InformationsquelleAutor der Antwort michaelAngelo
Den Schlüssel (Wortspiel beabsichtigt), um diese zu schaffen, ist eine
IComparable
-basierte Klasse, die behauptet, Gleichheit und Hash, aber nie im Vergleich zu 0, wenn nicht gleich. Diese kann getan werden, und erstellt werden können mit ein paar Boni - stabile Sortierung (Werte Hinzugefügt, um die sortierte Liste wird zunächst Ihre position behaupten), undToString()
kann einfach liefern der eigentliche Schlüssel, string-Wert.Hier ist eine struct-Taste, das sollte den trick tun:
InformationsquelleAutor der Antwort Bruce Pierson
Können Sie die SortedList ist, verwenden Sie Ihren Wert für die TKey, und int (count) für die TValue.
Hier ist ein Beispiel: Eine Funktion, sortiert die Buchstaben eines Wortes.
InformationsquelleAutor der Antwort Patrice Calvé
Der trick ist, vermehren Sie Ihr Objekt mit einem eindeutigen Schlüssel. Sehen Sie den folgenden test geht. Ich will
um meine Punkte, sortiert nach Ihren X-Wert. Nur mit einem nackten Point2D in meinem Vergleich-Funktion
Ursache Punkte mit dem gleichen X-Wert, beseitigt zu werden. Also ich Wickel die in Point2D, eine Klasse namens tagging
Indiziert ist.
Dienstprogramme, die diese Arbeit machen sind
Einen comparer, nimmt eine lambda -
Tagging-struct
InformationsquelleAutor der Antwort bradgonesurfing