Sintaxis de C #: dividir cadena en matriz por coma, convertir a lista genérica y orden inverso

92

¿Cuál es la sintaxis correcta para esto?

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

¿Qué estoy arruinando? ¿Qué significa TSource?

BuddyJoe
fuente

Respuestas:

253

El problema es que estás llamando List<T>.Reverse()que regresa void.

Puedes hacer:

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

o:

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

Este último es más caro, ya que revertir un arbitrario IEnumerable<T>implica almacenar en búfer todos los datos y luego cederlos todos, mientras que List<T>puede hacer toda la reversión "en el lugar". (La diferencia aquí es que llama al Enumerable.Reverse<T>()método de extensión, en lugar del List<T>.Reverse()método de instancia).

Más eficiente aún, podría usar:

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

Esto evita la creación de búferes de un tamaño inadecuado, a costa de tomar cuatro declaraciones donde una servirá ... Como siempre, sopese la legibilidad con el rendimiento en el caso de uso real.

Jon Skeet
fuente
25
¡el skeet es una bestia!
carne
2
bien elaborado, lo aprecio mucho!
Gaurav Aroraa
11

Me doy cuenta de que esta pregunta es bastante antigua, pero tuve un problema similar, excepto que mi cadena tenía espacios incluidos. Para aquellos que necesitan saber cómo separar una cadena con algo más que comas:

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

StringSplitOptions elimina los registros que solo serían un carácter de espacio ...

Des Horsley
fuente
Esto no funcionará si tuvieras "Tom Cruise" en lugar de solo Tom
llamas el
4
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

Este funciona.

Runa Grimstad
fuente
1

Prueba esto:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();
Yona
fuente
Recibo el error: no se puede convertir implícitamente el tipo 'void' en 'System.Collections.Generic.List <cadena>
BuddyJoe
1

Lo que te falta aquí es que .Reverse () es un método vacío. No es posible asignar el resultado de .Reverse () a una variable. Sin embargo, puede modificar el orden para usar Enumerable.Reverse () y obtener su resultado

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

La diferencia es que Enumerable.Reverse () devuelve un IEnumerable <T> en lugar de ser un retorno nulo

JaredPar
fuente
1

Si estas intentando

  1. Utilice varios delimitadores
  2. Filtrar cualquier cadena vacía
  3. Recorte los espacios iniciales / finales

lo siguiente debería funcionar:

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());

Salida

  • Tom
  • Crucero
  • Scott
  • Beto
  • a

Ahora, obviamente, puede invertir el orden como sugirieron otros.

ardiendo
fuente