Як перетворити Список <string> у Список <int>?


157

Моє питання є частиною цієї проблеми:

Я отримую колекцію ідентифікаторів із форми. Мені потрібно дістати ключі, перетворити їх у цілі числа та вибрати відповідні записи з БД.

[HttpPost]
public ActionResult Report(FormCollection collection)
{
    var listofIDs = collection.AllKeys.ToList();  
    // List<string> to List<int>
    List<Dinner> dinners = new List<Dinner>();
    dinners= repository.GetDinners(listofIDs);
    return View(dinners);
}

Відповіді:


391
listofIDs.Select(int.Parse).ToList()

Виняток піднято - LINQ для сутностей не розпізнає метод 'Int32 IndexOf (Char)', і цей метод не може бути переведений у вираз зберігання. .net 4.0
markthewizard1234

4
@ markthewizard1234 Це станеться, якщо ваш файл listofIDs, IQueryable<string>який не був виконаний. Виконайте це спочатку, ToList()перш ніж проводити конверсію:listofIDs.ToList().Select(int.Parse).ToList()
Майкл Хорнфек

Впевнений, у 2013 році це спрацювало, але це більше не працювало для мене. Нижче додано новий варіант, використовуючи оператор linq.
Брендон Турпі

1
Це призведе до виключення, якщо будь-який з рядків насправді не є ints. Дивіться безпечні версії нижче. stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck Перший ToList повинен бути як безліч, не потрібно виділяти другий список
Ronan Thibaudau

38

Використання Linq ...

List<string> listofIDs = collection.AllKeys.ToList();  
List<int> myStringList = listofIDs.Select(s => int.Parse(s)).ToList();

20

Ось безпечний варіант, який фільтрує недійсні вставки:

List<int> ints = strings
    .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null)
    .Where(n => n.HasValue)
    .Select(n => n.Value)
    .ToList();

Він використовує нове out змінні, введені з C # 7.0.

Цей інший варіант повертає список зведених нульових nullвводів, куди вставляються записи для недійсних входів (тобто він зберігає початковий кількість списку):

List<int?> nullableInts = strings
    .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null)
    .ToList();

Щиро дякую! Версія для C # 6.0 нижче stackoverflow.com/a/48712010/2340825
BA TabNabber


12

Що ні TryParse? Безпечна версія LINQ, яка фільтрує недійсні вставки (для C # 6.0 і нижче):

List<int>  ints = strings
    .Select(s => { int i; return int.TryParse(s, out i) ? i : (int?)null; })
    .Where(i => i.HasValue)
    .Select(i => i.Value)
    .ToList();

Подяка Олів'є Якот-Дескомб за ідею та версію C # 7.0.


3

Я знаю, що це стара публікація, але я подумав, що це хороше доповнення: Ви можете використовувати List<T>.ConvertAll<TOutput>

List<int> integers = strings.ConvertAll(s => Int32.Parse(s));

1

Це найпростіший спосіб, я думаю:

var listOfStrings = (new [] { "4", "5", "6" }).ToList();
var listOfInts = listOfStrings.Select<string, int>(q => Convert.ToInt32(q));

6
Я часто бачу такий візерунок у лямбдаських виразах: x => someMethod (x) . Ви знаєте, що, ймовірно, слід замінити це на якийсь метод . З цим ваш приклад стає listOfStrings.Select <string, int> (Convert.ToInt32); . Це, мабуть, читабельніше, швидше, коротше і я вже згадував про більш елегантне? Те саме стосується всіх інших, які відповідають на це питання.
JBSnorro

Я отримую помилку під час опускання синтаксису стрілки. Це працює: List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));але це не так: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);Помилка є неоднозначним викликом між string,int,intі string,intверсіями Select.
goodeye

1

Перетворити значення рядка в цілий список

var myString = "010"; 
int myInt;
List<int> B = myString.ToCharArray().Where(x => int.TryParse(x.ToString(), out myInt)).Select(x => int.Parse(x.ToString())).ToList();

0

Інший спосіб досягти цього - використання оператора linq. Рекомендована відповідь для мене не працювала в .NetCore2.0. Я зміг зрозуміти це, однак і нижче це також спрацює, якщо ви використовуєте новіші технології.

[HttpPost]
public ActionResult Report(FormCollection collection)
{
    var listofIDs = collection.ToList().Select(x => x.ToString());
    List<Dinner> dinners = new List<Dinner>();
    dinners = repository.GetDinners(listofIDs);
    return View(dinners);
}

0

Ви можете використовувати його через LINQ

     var selectedEditionIds = input.SelectedEditionIds.Split(",").ToArray()
                            .Where(i => !string.IsNullOrWhiteSpace(i) 
                             && int.TryParse(i,out int validNumber))
                            .Select(x=>int.Parse(x)).ToList();

Виглядає TryParse досить марно, що дає вам значення, а потім просто викиньте це значення у вікно, щоб потім зробити аналіз. Ви по суті подвійний аналіз.
Рістогод


0

Це може бути зайвим для цієї простої проблеми. Але для методів Try-Do у зв'язку з Linq я схильний використовувати анонімні класи для більш виразного коду. Це схоже на відповіді Олів'є Якот-Дескомбаса та BA TabNabber :

List<int> ints = strings
    .Select(idString => new { ParseSuccessful = Int32.TryParse(idString, out var id), Value = id })
    .Where(id => id.ParseSuccessful)
    .Select(id => id.Value)
    .ToList();

-1
  public List<int> ConvertStringListToIntList(List<string> list) 
  {
     List<int> resultList = new List<int>();
     for (int i = 0; i < list.Count; i++)
        resultList.Add(Convert.ToInt32(list[i]));

     return resultList;
  }

3
Подумайте про те, щоб додати деякі текстові пояснення щодо своєї відповіді, а не вводити лише код.
carlosfigueira

-1
yourEnumList.Select(s => (int)s).ToList()

Привіт Патрику. Ласкаво просимо до StackOverflow. Було б краще, якщо ви могли б написати трохи більше опису щодо викладеного вами досить стислого рішення. Це відповідь на дуже давнє запитання на цьому веб-сайті, і його розгляне кілька користувачів.
Адітя
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.