Как преобразовать список <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 to Entities не распознает метод метода Int32 IndexOf (Char), и этот метод нельзя преобразовать в выражение хранилища. .net 4.0
— markthewizard1234

4
@ markthewizard1234 Это произойдет , если ваш listofIDsесть , IQueryable<string>что не было выполнено. Выполните это сначала, ToList()прежде чем вы сделаете преобразование:listofIDs.ToList().Select(int.Parse).ToList()
— Майкл Хорнфек

Я уверен, что в 2013 году это сработало, но у меня это больше не сработало. Добавлена ​​более новая опция ниже с использованием оператора linq.
— Брэндон Терпи

1
Это вызовет исключение, если любая из строк не является целой. Смотрите безопасные версии ниже. stackoverflow.com/a/48712010/2340825
— BA TabNabber

@MichaelHornfeck Первый ToList должен быть AsEnumerable, нет необходимости выделять второй List
— Ронан Тибо,

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) . Вы знаете, что вы, вероятно, должны заменить это на someMethod . С этим ваш пример становится 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,intSelect.
— 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, который дает вам значение, а затем просто выбрасывает это значение в окно, чтобы затем выполнить анализ. Вы по сути двойной анализ.
— Ristogod


0

Это может быть излишним для этой простой проблемы. Но для методов Try-Do в связи с Linq я склонен использовать анонимные классы для более выразительного кода. Это похоже на ответы Оливье Жако-Дескомба и Б.А. ТабНаббера :

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
Попробуйте добавить текстовое объяснение вашего ответа вместо предоставления только кода.
— Карлосфигейра

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

Привет, Патрик. Добро пожаловать в StackOverflow. Было бы лучше, если бы вы могли написать немного больше описания о довольно кратком решении, которое вы опубликовали. Это ответ на очень старый вопрос на этом сайте, который будет рассмотрен несколькими пользователями.
— Адитья
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.