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

StackOverflow https://stackoverflow.com/questions/315358

  •  10-07-2019
  •  | 
  •  

Domanda

Qual è la sintassi corretta per questo:

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

Cosa sto combinando?Cosa significa TSource?

È stato utile?

Soluzione

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

Puoi fare:

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 IEnumerable<T> arbitrario comporta il buffering di tutti i dati e quindi la resa di tutti - mentre List<T> può fare tutto l'inversione " sul posto " . (La differenza qui è che sta chiamando il Enumerable.Reverse<T>() metodo di estensione, invece del <=> metodo di istanza.)

Ancora più efficiente, puoi usare:

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

Questo evita di creare buffer di dimensioni inadeguate, a scapito di prendere quattro dichiarazioni in cui uno farà ... Come sempre, soppesare la leggibilità rispetto alle prestazioni nel caso d'uso reale.

Altri suggerimenti

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

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

StringSplitOptions rimuove i record che sarebbero solo un carattere spaziale ...

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

Questo funziona.

Prova questo:

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

Quello che ti manca qui è che .Reverse () è un metodo vuoto. Non è possibile assegnare il risultato di .Reverse () a una variabile. Puoi comunque modificare l'ordine per usare Enumerable.Reverse () e ottenere il tuo risultato

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

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

Se ci stai provando

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

quanto segue 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top