Zerlegen von Strings in längenbasierte Listen in Wörter c #

7

Ich habe eine Reihe von Wörtern, die durch Leerzeichen getrennt sind. Wie teilt man die Zeichenkette in Wortlisten basierend auf den Wörtern Länge?

Beispiel

  

Eingabe:

%Vor%      

Ausgabe:

%Vor%
    
FSm 07.07.2012, 20:19
quelle

5 Antworten

6
  

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).

Ein einfacher Ansatz

%Vor%

Erklärung

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.   A Lookup<TKey, TElement> ähnelt einem Dictionary<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 Objekt ToLookup aufrufen   das implementiert IEnumerable<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).

Verwendung

Schreibe alle Wörter auf die Konsole

(ähnlich der ursprünglich angeforderten Ausgabe der Frage)

%Vor%

Ausgabe

%Vor%

Setze alle Wörter einer bestimmten Länge in List

%Vor%

Reihenfolge nach Schlüssel

(Beachten Sie, dass diese IOrderedEnumerable<T> zurückgeben, so dass der Zugriff per Schlüssel nicht mehr möglich ist)

%Vor%

Ursprüngliche Antwort - bitte tu das nicht (schlechte Leistung, Code-Unordnung):

%Vor%     
Adam 07.07.2012, 21:11
quelle
10

Sie können Where verwenden, um Elemente zu finden, die mit einem Prädikat übereinstimmen (in diesem Fall mit der richtigen Länge):

%Vor%

Alternativ könnten Sie GroupBy verwenden, um alle Gruppen gleichzeitig zu finden:

%Vor%

Sie können auch ToLookup verwenden, damit Sie leicht alle Wörter mit einer bestimmten Länge finden können:

%Vor%

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.

%Vor%

Ausgabe:

%Vor%

Sehen Sie, wie es online funktioniert: ideone

    
Mark Byers 07.07.2012 20:21
quelle
3

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%

AKTUALISIEREN

Wenn Sie möchten, können Sie das Ergebnis sofort verarbeiten, anstatt es in eine Datenstruktur zu setzen

%Vor%     
Olivier Jacot-Descombes 07.07.2012 20:40
quelle
1

Sie können Linq GroupBy

verwenden

Bearbeiten 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%     
Mare Infinitus 07.07.2012 20:42
quelle
0

Eine etwas langwierige Lösung, die aber das Ergebnis in einem Dictionary

liefert %Vor%     
HatSoft 07.07.2012 21:13
quelle

Tags und Links