Sintaxe C # - Dividir string em matriz por vírgula, converter em lista genérica e ordem reversa


92

Qual é a sintaxe correta para isso:

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

O que estou bagunçando? O que significa o TSource?

Respostas:


251

O problema é que você está ligando List<T>.Reverse()e retorna void.

Você pode fazer:

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

ou:

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

O último é mais caro, pois a reversão de um arbitrário IEnumerable<T>envolve o armazenamento em buffer de todos os dados e, em seguida, o rendimento de todos - enquanto List<T>pode fazer toda a reversão "no local". (A diferença aqui é que ele está chamando o Enumerable.Reverse<T>()método de extensão, em vez do List<T>.Reverse()método de instância.)

Mais eficiente ainda, você pode usar:

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

Isso evita a criação de quaisquer buffers de tamanho inadequado - ao custo de pegar quatro declarações onde uma servirá ... Como sempre, compare a legibilidade com o desempenho no caso de uso real.


25
Skeet é uma besta!
carne

2
bem elaborado, gostei muito!
Gaurav Aroraa

11

Sei que essa questão é bastante antiga, mas tive um problema semelhante, exceto que minha string tinha espaços incluídos. Para aqueles que precisam saber como separar uma string com mais do que apenas vírgulas:

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

O StringSplitOptions remove os registros que seriam apenas um caractere de espaço ...


Isso não funcionará se você tivesse "Tom Cruise" em vez de apenas Tom
chamas em

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

Este funciona.


1

Experimente isto:

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

Recebo o erro - Não é possível converter implicitamente o tipo 'void' em 'System.Collections.Generic.List <string>
BuddyJoe

1

O que está faltando aqui é que .Reverse () é um método vazio. Não é possível atribuir o resultado de .Reverse () a uma variável. No entanto, você pode alterar a ordem para usar Enumerable.Reverse () e obter seu resultado

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

A diferença é que Enumerable.Reverse () retorna um IEnumerable <T> em vez de ser void return


1

Se você está tentando

  1. Use vários delimitadores
  2. Filtre quaisquer strings vazias
  3. Cortar espaços à esquerda / à direita

o seguinte deve 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());

Resultado

  • Tom
  • Cruzeiro
  • Scott
  • Prumo
  • em

Agora você pode obviamente inverter a ordem como outros sugeriram.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.