Sintassi C #: suddivisione della stringa in matrice tramite virgola, conversione in elenco generico e ordine inverso


92

Qual è la sintassi corretta per questo:

IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse();

Cosa sto sbagliando? Cosa significa TSource?

Risposte:


251

Il problema è che stai chiamando List<T>.Reverse()che ritorna void.

Puoi fare o:

List<string> names = "Tom,Scott,Bob".Split(',').ToList<string>();
names.Reverse();

o:

IList<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>();

Quest'ultimo è più costoso, poiché l'inversione di un arbitrario IEnumerable<T>implica il buffering di tutti i dati e quindi la restituzione di tutti, mentre List<T>può fare tutto l'inversione "sul posto". (La differenza qui è che chiama il Enumerable.Reverse<T>()metodo di estensione, invece del List<T>.Reverse()metodo di istanza.)

Ancora più efficiente, potresti usare:

string[] namesArray = "Tom,Scott,Bob".Split(',');
List<string> namesList = new List<string>(namesArray.Length);
namesList.AddRange(namesArray);
namesList.Reverse();

Ciò evita di creare buffer di dimensioni inadeguate, al costo di prendere quattro affermazioni dove una andrà bene ... Come sempre, valuta la leggibilità rispetto alle prestazioni nel caso d'uso reale.


25
lo skeet è una bestia!
carne

2
ben elaborato, ho davvero apprezzato!
Gaurav Aroraa

11

Mi rendo conto che questa domanda è piuttosto vecchia, ma ho avuto un problema simile, tranne per il fatto che la mia stringa aveva degli spazi inclusi. Per coloro che hanno bisogno di sapere come separare una stringa con più di semplici virgole:

string str = "Tom, Scott, Bob";
  IList<string> names = str.Split(new string[] {","," "},
  StringSplitOptions.RemoveEmptyEntries);

StringSplitOptions rimuove i record che sarebbero solo uno spazio carattere ...


Questo non funzionerà se avessi "Tom Cruise" invece solo Tom
fiamme il

4
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

Questo funziona.


1

Prova questo:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();

Ottengo l'errore - Impossibile convertire implicitamente il tipo "void" in "System.Collections.Generic.List <string>
BuddyJoe

1

Quello che ti manca qui è che .Reverse () è un metodo void. Non è possibile assegnare il risultato di .Reverse () a una variabile. È tuttavia possibile modificare l'ordine per utilizzare Enumerable.Reverse () e ottenere il risultato

var x = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>()

La differenza è che Enumerable.Reverse () restituisce un IEnumerable <T> invece di essere void return


1

Se stai cercando di

  1. Usa più delimitatori
  2. Filtra le stringhe vuote
  3. Taglia gli spazi iniziali / finali

dovrebbe funzionare:

string str = "Tom Cruise, Scott, ,Bob | at";
IEnumerable<string> names = str
                            .Split(new char[]{',', '|'})
                            .Where(x=>x!=null && x.Trim().Length > 0)
                            .Select(x=>x.Trim());

Produzione

  • Tom
  • Crociera
  • Scott
  • Bob
  • a

Ora puoi ovviamente invertire l'ordine come suggerito da altri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.