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?

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.


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


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.


1

Prueba esto:

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

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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.