Преобразование List <int> в List <string> в .NET 2.0

97

Вы можете бросить , List<int>чтобы List<string>каким - то образом?

Я знаю, что могу перебрать и .ToString (), но приведение было бы потрясающим.

Я использую С # 2.0 (поэтому без LINQ ).

Lomaxx
источник

Ответы:

151

В .NET 2.0 есть ConvertAllметод, в котором вы можете передать функцию конвертера:

List<int>    l1 = new List<int>(new int[] { 1, 2, 3 } );
List<string> l2 = l1.ConvertAll<string>(delegate(int i) { return i.ToString(); });
Гленн Славен
источник
117

Обновлено на 2010 год

List<int> l1 = new List<int>(new int[] { 1,2,3 } );
List<string> l2 = l1.ConvertAll<string>(x => x.ToString());
Люк
источник
6
Спасибо! Это сэкономило мне массу времени,
Стив Френч
2
Нет, лямбды были введены в C # 3.0, поэтому в 2.0 это не будет работать.
Люк,
Я обнаружил, что он работает с VS2008 и .NET 2.0, если у вас установлен хотя бы .NET 3.0. см. stackoverflow.com/questions/3341846/…
igelineau
1
Люди должны различать версию .NET и версию C #. Поскольку стрелка x => x.ToString()скомпилирована для того же типа IL, что и delegate(int x) { return x.ToString(); }в этом случае, важно иметь компилятор C # (версия C #), который знает, что это =>такое. Платформа и среда выполнения (версия .NET) не требуют для этого специальных функций, поэтому .NET 2.0 здесь подойдет.
Йеппе Стиг Нильсен,
Оказывается, можно отказаться, <string>и это все еще работает. Делая это простоl1.ConvertAll(x => x.ToString());
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ 06
8

Может ли C # 2.0 List<T>.Convert? Если это так, я думаю, что лучше всего будет использовать это с делегатом:

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

Что-то в этом роде.


Проголосуйте за ответ Гленна, который, вероятно, является правильным кодом ;-)

Эрик ван Бракель
источник
6

Ты можешь использовать:

List<int> items = new List<int>(new int[] { 1,2,3 } );
List<string> s = (from i in items select i.ToString()).ToList();
Лютецкий
источник
5

Вы не могли бы непосредственно брось , как не существует никаких явных или неявных литая из междунар в строку, она будет иметь , чтобы быть методом , включающим .ToString () , такие как: -

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

Изменить - или, как другие блестяще указывали, используйте intList.ConvertAll (delegate (int i) {return i.ToString ();});, однако очевидно, что вам все равно придется использовать .ToString (), и это преобразование, а не в ролях.

ljs
источник
3
Существование приведения между универсальными типами не имеет ничего общего с возможностью приведения типов между проекциями. IE, даже если он intбыл явно или неявно преобразован в string, это не означает, что он List<int>имеет неявное или явное преобразование в List<string>.
Адам Робинсон
1

Вы должны составить новый список. Базовые битовые представления List<int>и List<string>полностью несовместимы - например, на 64-битной платформе отдельные члены даже не одного размера.

Теоретически можно рассматривать a List<string>как a List<object>- это вводит вас в захватывающие миры ковариации и контравариантности и в настоящее время не поддерживается C # или VB.NET.

Курт Хагенлохер
источник
@Curt :> Теоретически можно рассматривать> List <string> как List <object> -> это вводит вас в захватывающие миры> ковариации и контравариантности, а> в настоящее время не поддерживается C # или> VB. NET C # и .NET действительно поддерживают ковариацию. Только не с дженериками.
Кристиан Хагелид,
1

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

замените параметры result и listOfInt на свои параметры

Джаянт Раджвани
источник
У меня корректно работал result = listOfInt.Select (i => i.ToString ()). ToList ();
Шарунас Бельскис