Bearbeiten: Ich bin froh, dass meine ursprüngliche Antwort dem OP geholfen hat, sein Problem zu lösen. Nachdem ich jedoch das Problem ein wenig durchdacht habe, habe ich es angepasst (und ich empfehle gegen meine frühere Lösung, die ich am Ende des Posts hinterlassen habe).
Zuerst trimmen wir die Eingabe, um leere Elemente aus den äußeren Räumen zu vermeiden. Dann teilen wir die Zeichenfolge in ein Array auf. Wenn mehrere Leerzeichen zwischen den Wörtern vorkommen, müssen Sie StringSplitOptions
wie in Marks Antwort verwenden .
Nachdem Distinct
aufgerufen wurde, um jedes Wort nur einmal einzuschließen, konvertieren wir nun words
von IEnumerable<string>
in Lookup<int, string>
, wobei die Wörter 'length' durch den Schlüssel (int)
repräsentiert werden und die Wörter selbst gespeichert werden der Wert (string)
.
Moment mal, wie ist das überhaupt möglich? Haben wir nicht mehrere Wörter für jeden Schlüssel? Sicher, aber genau das ist die Lookup
Klasse für:
Lookup<TKey, TElement>
stellt eine Sammlung von Schlüsseln dar, die jeweils einem oder mehreren zugeordnet sind Werte. ALookup<TKey, TElement>
ähnelt einemDictionary<TKey, TValue>
. Der Unterschied ist der Ein Dictionary ordnet Schlüssel einzelnen Werten zu, während ein Lookup ordnet Schlüsseln zu Auflistungen von Werten zu.Sie können eine Instanz von
Lookup
erstellen, indem Sie für ein ObjektToLookup
aufrufen das implementiertIEnumerable<T>
.Hinweis
Es gibt keinen öffentlichen Konstruktor, um eine neue Instanz eines Lookups zu erstellen. Darüber hinaus sind Suchobjekte unveränderbar, dh Sie können nicht hinzufügen oder Entfernen Sie Elemente oder Schlüssel aus einem Lookup, nachdem es erstellt wurde.
word => word.Length
ist der KeySelector Lambda: Er definiert, dass wir den Lookup
durch die Länge der Wörter indizieren (oder gruppieren möchten).
(ähnlich der ursprünglich angeforderten Ausgabe der Frage)
%Vor%Ausgabe
%Vor%
List
(Beachten Sie, dass diese IOrderedEnumerable<T>
zurückgeben, so dass der Zugriff per Schlüssel nicht mehr möglich ist)
Ursprüngliche Antwort - bitte tu das nicht (schlechte Leistung, Code-Unordnung):
%Vor% Sie können Where
verwenden, um Elemente zu finden, die mit einem Prädikat übereinstimmen (in diesem Fall mit der richtigen Länge):
Alternativ könnten Sie GroupBy
verwenden, um alle Gruppen gleichzeitig zu finden:
Sie können auch ToLookup
verwenden, damit Sie leicht alle Wörter mit einer bestimmten Länge finden können:
Ergebnis:
%Vor%Sehen Sie, wie es online funktioniert: ideone
In Ihrem Update sieht es so aus, als ob Sie die leeren Strings und duplizierten Wörter entfernen möchten. Sie können erstere mit StringSplitOptions.RemoveEmptyEntries
und letztere mit Distinct
machen.
Ausgabe:
%Vor%Sehen Sie, wie es online funktioniert: ideone
Zuerst deklarieren wir eine Klasse, die eine Länge sowie eine Liste von Wörtern enthalten kann
%Vor%Nun können wir eine Liste von Wortlisten mit
erstellen %Vor%Die Listen sind nach Länge und aphabetisch sortiert.
Ergebnis
z.B.
%Vor%Wenn Sie möchten, können Sie das Ergebnis sofort verarbeiten, anstatt es in eine Datenstruktur zu setzen
%Vor%Sie können Linq GroupBy
verwendenBearbeiten Jetzt habe ich Linq angewendet, um die gewünschte String-Liste für die Ausgabe zu generieren.
edit2 Angewandte Mehrfacheingabe, Einzelausgabe wie in bearbeiteter Frage. Es ist nur ein eindeutiger Aufruf in Linq
%Vor%