Converter uma lista em uma string em C #

184

Como converter uma lista em uma seqüência de caracteres em c #?

Quando executo toStringum objeto List, recebo:

System.Collections.Generic.List`1 [System.String]

IAdapter
fonte
1
Uma lista é uma coleção, como é essa string?
Marko
Você pode tentar qualquer uma das três maneiras mencionadas aqui .
RBT

Respostas:

365

Talvez você esteja tentando fazer

string combindedString = string.Join( ",", myList.ToArray() );

Você pode substituir "," pelo que deseja dividir os elementos da lista.

Edit : Como mencionado nos comentários, você também pode fazer

string combindedString = string.Join( ",", myList);

Referência:

Join<T>(String, IEnumerable<T>) 
Concatenates the members of a collection, using the specified separator between each member.
Øyvind Bråthen
fonte
4
você quer dizer string combindedString = string.Join (",", myList.ToArray ());
7288
2
Argumento '2': não é possível converter de 'System.Collections.Generic.List <string>' para 'string []'
Ash
9
Eu usei esse recentemente, ele funciona - basta omitir o .ToArray ()
Adrian K
3
@AdrianK, você está correto porque o .Net 4.0 adicionou a capacidade de passar qualquer IEnumerable <string>. No entanto 4.0 foi lançado em abril de 2010, antes desta pergunta e resposta foram publicadas por isso, talvez as pessoas aqui foram apenas ainda não conscientes disso (excepto alguns abaixo)
Andrew Steitz
Para vb.net, Dim combindedString As String = String.Join (",", myList.ToArray ())
PartTimeNerd
55

Vou seguir meu pressentimento e supor que você deseja concatenar o resultado de chamar ToStringcada elemento da lista.

var result = string.Join(",", list.ToArray());
ChaosPandion
fonte
16

Você poderia usar string.Join:

List<string> list = new List<string>()
{
    "Red",
    "Blue",
    "Green"
};

string output = string.Join(Environment.NewLine, list.ToArray());    
Console.Write(output);

O resultado seria:

Red    
Blue    
Green

Como alternativa Environment.NewLine, você pode substituí-lo por um separador de linhas baseado em string de sua escolha.

eandersson
fonte
14

Se você quiser algo um pouco mais complexo que uma simples junção, use o LINQ, por exemplo

var result = myList.Aggregate((total, part) => total + "(" + part.ToLower() + ")");

Vai pegar ["A", "B", "C"] e produzir "(a) (b) (c)"

James Gaunt
fonte
1
Use Agregar com uma semente como o primeiro parâmetro para evitar lançar InvalidOperationException para coleções vazias.
Huacanacha 25/11
13

String.Join(" ", myList)ou String.Join(" ", myList.ToArray()). O primeiro argumento é o separador entre as substrings.

var myList = new List<String> { "foo","bar","baz"};
Console.WriteLine(String.Join("-", myList)); // prints "foo-bar-baz"

Dependendo da sua versão do .NET, talvez seja necessário usar o ToArray () na lista primeiro.

Markus Johnsson
fonte
9

Você tem um List<string>- então, se você deseja que eles sejam concatenados, algo como

string s = string.Join("", list);

funcionaria (pelo menos no .NET 4.0). O primeiro parâmetro é o delimitador. Então você também pode delimitar vírgulas etc.

Você também pode querer usar o StringBuilder para executar concatenações, em vez de formar uma lista.

Marc Gravell
fonte
8

O .ToString()método para tipos de referência geralmente volta paraSystem.Object.ToString() , menos que você o substitua em um tipo derivado (possivelmente usando métodos de extensão para os tipos internos). O comportamento padrão desse método é gerar o nome do tipo em que é chamado. Então, o que você está vendo é o comportamento esperado.

Você pode tentar algo parecido string.Join(", ", myList.ToArray());para conseguir isso. É uma etapa extra, mas pode ser aplicada em um método de extensão System.Collections.Generic.List<T>para facilitar um pouco. Algo assim:

public static class GenericListExtensions
{
    public static string ToString<T>(this IList<T> list)
    {
        return string.Join(", ", list);
    }
}

(Observe que este é um código à mão livre e não testado. Eu não tenho um compilador à mão no momento. Portanto, convém experimentar um pouco.)

David
fonte
funciona quando eu não chamo ToString ou o executo com parâmetro genérico. Mas eu gosto da sua ideia de usar método de extensão :)
IAdapter
4

É difícil dizer, mas talvez você esteja procurando algo como:

var myString = String.Join(String.Empty, myList.ToArray());

Isso implicitamente chamará o método ToString () em cada um dos itens da lista e os concatenará.

Daniel Schaffer
fonte
1
String.Concat()vai conseguir a mesma coisa melhor.
Jeff Mercado
2

Se você está olhando para transformar os itens em uma lista em uma grande cadeia longa, faça o seguinte: String.Join("", myList). Algumas versões mais antigas da estrutura não permitem que você passe um IEnumerable como o segundo parâmetro, portanto, pode ser necessário converter sua lista em uma matriz chamando .ToArray ().

mattmc3
fonte
2

A resposta direta à sua pergunta é String.Join como outros já mencionaram.

No entanto, se você precisar de algumas manipulações, poderá usar Aggregate:

List<string> employees = new List<string>();
employees.Add("e1");
employees.Add("e2");
employees.Add("e3");

string employeesString = "'" + employees.Aggregate((x, y) => x + "','" + y) + "'";
Console.WriteLine(employeesString);
Console.ReadLine();
LCJ
fonte
1
no código de produção, verifique se a sua lista possui algum elemento, caso contrário ela gerará uma exceção.
AZ_ 30/09/19
1

Esse método me ajudou ao tentar recuperar dados do arquivo de texto e armazená-lo na matriz e, em seguida, atribuí-lo a uma string disponível.

string[] lines = File.ReadAllLines(Environment.CurrentDirectory + "\\Notes.txt");  
string marRes = string.Join(Environment.NewLine, lines.ToArray());

Espero que possa ajudar alguém !!!!

PatsonLeaner
fonte
0

Isso parece funcionar para mim.

var combindedString = new string(list.ToArray());
mutuma
fonte
0

todas as respostas acima NÃO funcionam para listas aninhadas.

Andreas Otto
fonte