Cast List <int> para List <string> no .NET 2.0

96

Você pode lançar um List<int>para de List<string>alguma forma?

Eu sei que poderia fazer um loop e .ToString () a coisa, mas um elenco seria incrível.

Estou em C # 2.0 (sem LINQ ).

lomaxx
fonte

Respostas:

151

.NET 2.0 tem o ConvertAllmétodo pelo qual você pode passar uma função de conversor:

List<int>    l1 = new List<int>(new int[] { 1, 2, 3 } );
List<string> l2 = l1.ConvertAll<string>(delegate(int i) { return i.ToString(); });
Glenn Slaven
fonte
116

Atualizado para 2010

List<int> l1 = new List<int>(new int[] { 1,2,3 } );
List<string> l2 = l1.ConvertAll<string>(x => x.ToString());
Lucas
fonte
6
Obrigado! Isso me economizou muito tempo
Steve French,
2
Não, lambdas foram introduzidos no C # 3.0, portanto, isso não funcionará no 2.0.
Lucas
Descobri que funciona com VS2008 e .NET 2.0, desde que você tenha pelo menos .NET 3.0 instalado. consulte stackoverflow.com/questions/3341846/…
igelineau
1
As pessoas devem diferenciar entre a versão .NET e a versão C #. Como a seta x => x.ToString()é compilada para o mesmo tipo de IL que está delegate(int x) { return x.ToString(); }neste caso, o importante é ter um compilador C # (versão C #) que saiba o que =>é. A estrutura e o tempo de execução (versão .NET) não precisam de recursos especiais para isso, então .NET 2.0 está bem aqui.
Jeppe Stig Nielsen
Acontece que você pode se livrar <string>e ainda funciona. Simplesmentel1.ConvertAll(x => x.ToString());
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
8

O C # 2.0 é capaz de fazer List<T>.Convert? Nesse caso, acho que seu melhor palpite seria usar isso com um delegado:

List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Convert(delegate (int i) { return i.ToString(); });

Algo nesse sentido.


Vote positivamente na resposta de Glenn, que provavelmente é o código correto ;-)

Erik van Brakel
fonte
6

Você pode usar:

List<int> items = new List<int>(new int[] { 1,2,3 } );
List<string> s = (from i in items select i.ToString()).ToList();
Lutecki
fonte
5

Você não seria capaz de convertê-lo diretamente, pois não existe conversão explícita ou implícita de int para string, teria que ser um método envolvendo .ToString (), como: -

foreach (int i in intList) stringList.Add(i.ToString());

Editar - ou como outros apontaram brilhantemente, use intList.ConvertAll (delegate (int i) {return i.ToString ();}) ;, no entanto, claramente você ainda tem que usar .ToString () e é uma conversão em vez de um elenco.

ljs
fonte
3
A existência de um elenco entre os tipos genéricos não tem nada a ver com a capacidade de elenco entre as projeções. IE, mesmo se intfosse implícita ou explicitamente conversível para string, isso não significa que List<int>tenha uma conversão implícita ou explícita para List<string>.
Adam Robinson
1

Você tem que construir uma nova lista. As representações de bits subjacentes List<int>e List<string>são completamente incompatíveis - em uma plataforma de 64 bits, por exemplo, os membros individuais não têm nem mesmo o mesmo tamanho.

É teoricamente possível tratar a List<string>como a List<object>- isso leva você aos mundos emocionantes da covariância e da contravariância, e não é atualmente suportado por C # ou VB.NET.

Curt Hagenlocher
fonte
@Curt :> É teoricamente possível tratar> uma List <string> como uma List <object> -> isso leva você aos mundos emocionantes> de covariância e contravariância, e> não é atualmente suportado por C # ou> VB. NET C # e .NET realmente oferecem suporte a Covariância. Só não com genéricos.
Christian Hagelid,
1

result = listOfInt.Select(i => i.ToString(CultureInfo.InvariantCulture)).ToList()

substitua os parâmetros result e listOfInt para seus parâmetros

Jayant Rajwani
fonte
Para mim funcionou corretamente result = listOfInt.Select (i => i.ToString ()). ToList ();
Sharunas Bielskis