Lista de strings para uma string

206

Digamos que você tenha um:

List<string> los = new List<string>();

Neste mundo funcional maluco que vivemos atualmente, qual seria o melhor para criar uma string concatenando:

String.Join(String.Empty, los.ToArray());

StringBuilder builder = new StringBuilder();
los.ForEach(s => builder.Append(s));

string disp = los.Aggregate<string>((a, b) => a + b);

foreach StringBuilder antigo simples ou

Ou há um modo melhor?

maxfridbe
fonte
9
Looks como .Net 4 também irá incluir uma String.Join (string, IEnumerable <string>), permitindo que você pule o ToArray () msdn.microsoft.com/en-us/library/dd783876.aspx
luke

Respostas:

289

Eu iria com a opção A:

String.Join(String.Empty, los.ToArray());

Meu raciocínio é que o método Join foi escrito para esse fim. De fato, se você olhar para o Reflector, verá que o código não seguro foi usado para realmente otimizá-lo. Os outros dois também TRABALHAM, mas acho que a função Join foi escrita para esse fim e, eu acho, a mais eficiente. Eu poderia estar errado ...

Conforme @Nuri YILMAZ sem .ToArray(), mas este é o .NET 4+:

String.Join(String.Empty, los);
BFree
fonte
GA! Eu nem vi essa opção na primeira leitura depois dela.
Joel Coehoorn
2
3 vezes mais rápido que o StringBuilder? Uau, imaginei que seria mais rápido, não percebi o quanto mais rápido. Faz sentido, porém, é feito em código não seguro usando ponteiros, então ..... faz sentido.
BFree
8
legais! única observação: Join não precisa de los.ToArray (), porque List <T> pode converter IEnumarable <T>.
Nuri YILMAZ 10/03
8
@Nuri: Esta pergunta foi feita em 08, antes do .Net 4 ser lançado. A sobrecarga que IEnumerable <T> foi adicionado em .Net 4.
BFree
2
String.Join em conjunto com String.Concat é dourado. Ex: 'String.Concat ("{", String.Join (",", m_Data), "}"));'
KornMuffin 21/10
51
string.Concat(los.ToArray());

Se você quiser concatenar as strings, use string.Concat () em vez de string.Join ().

Pent Ploompuu
fonte
18

Se você usa o .net 4.0, pode usar uma maneira classificadora:

String.Join<string>(String.Empty, los);
mnieto
fonte
10

String.Join () é implementado rapidamente, e como você já tem uma coleção das seqüências em questão, é provavelmente a melhor opção. Acima de tudo, grita "Estou entrando em uma lista de strings!" Sempre bom.

J Cooper
fonte
7
los.Aggregate((current, next) => current + "," + next);
landrady
fonte
5

Meu voto é string.

Não há necessidade de avaliações lambda e funções temporárias a serem criadas, menos chamadas de função, menos empilhamento e popping de pilha.

Tom Ritter
fonte