Передати список <int> у список <string> у .NET 2.0


97

Ви можете кинути , List<int>щоб List<string>яким - то чином?

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

Я в C # 2.0 (тому немає LINQ ).

Відповіді:


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 тут чудово працює.
Jeppe Stig Nielsen

Виявляється, ви можете відмовитись, <string>і це все ще працює. Це простоl1.ConvertAll(x => x.ToString());
ʙᴀᴋᴇʀ

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

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

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

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


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

1

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

Теоретично можна розглядати a List<string>як 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 ();
Шарунас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.