Comment convertir List <string> en List <int>?


157

Ma question fait partie de ce problème:

Je reçois une collection d'identifiants à partir d'un formulaire. J'ai besoin d'obtenir les clés, de les convertir en nombres entiers et de sélectionner les enregistrements correspondants dans la base de données.

[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);
}

Réponses:


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

Exception levée - LINQ to Entities ne reconnaît pas la méthode «Int32 IndexOf (Char)», et cette méthode ne peut pas être traduite en une expression de magasin. .net 4.0
— markthewizard1234

4
@ markthewizard1234 Cela se produira si votre listofIDsest un IQueryable<string>qui n'a pas été exécuté. Exécutez-le d'abord avec ToList()avant de faire la conversion:listofIDs.ToList().Select(int.Parse).ToList()
— Michael Hornfeck

Je suis sûr qu'en 2013 cela fonctionnait, mais cela ne fonctionnait plus pour moi. Ajout d'une option plus récente ci-dessous en utilisant l'instruction linq.
— Brandon Turpy

1
Cela lèvera une exception si l'une des chaînes n'est pas réellement des entiers. Voir les versions sûres ci-dessous. stackoverflow.com/a/48712010/2340825
— BA TabNabber

@MichaelHornfeck La première ToList devrait être AsEnumerable, pas besoin d'allouer une deuxième liste
— Ronan Thibaudau

38

Utilisation de Linq ...

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

20

Voici une variante sûre qui filtre les entrées invalides:

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

Il utilise les nouvelles outvariables introduites avec C # 7.0.

Cette autre variante renvoie une liste d'entiers Nullable où des nullentrées sont insérées pour des entiers invalides (c'est-à-dire qu'elle préserve le nombre de listes d'origine):

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

Grand merci! Version pour C # 6.0 ci-dessous stackoverflow.com/a/48712010/2340825
— BA TabNabber

13

Utilisation de Linq:

var intList = stringList.Select(s => Convert.ToInt32(s)).ToList()

1
var intList = stringList.Select (Convert.ToInt32) .ToList ()
— shivani

12

Qu'est-ce pas TryParse? Version Safe LINQ qui filtre les entrées non valides (pour C # 6.0 et versions antérieures ):

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();

merci à Olivier Jacot-Descombes pour l'idée et la version C # 7.0.


3

Je sais que c'est un ancien message, mais je pense que c'est un bon ajout: vous pouvez utiliser List<T>.ConvertAll<TOutput>

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

1

C'est le moyen le plus simple, je pense:

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

6
Je vois souvent ce type de modèle dans les expressions lambda: x => someMethod (x) . Vous savez que vous devriez probablement remplacer cela par une méthode . Avec cela, votre exemple devient listOfStrings.Select <string, int> (Convert.ToInt32); . C'est probablement plus lisible, plus rapide, plus court et ai-je déjà mentionné plus élégant? Il en va de même pour tous les autres répondant à cette question.
— JBSnorro

J'obtiens une erreur en omettant la syntaxe de la flèche. Cela fonctionne: List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));mais ce n'est pas le cas: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);L'erreur est un appel ambigu entre les versions string,int,intet string,intde Select.
— goodeye le

1

Convertir la valeur de la chaîne en liste d'entiers

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

Une autre façon d'accomplir cela serait d'utiliser une instruction linq. La réponse recommandée n'a pas fonctionné pour moi dans .NetCore2.0. J'ai pu le comprendre cependant et ci-dessous fonctionnerait également si vous utilisez une technologie plus récente.

[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

Vous pouvez l'utiliser via LINQ

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

Cela semble assez inutile pour TryParse, qui vous donne la valeur, puis jetez simplement cette valeur par la fenêtre pour ensuite faire une analyse. Vous faites essentiellement une double analyse.
— Ristogod

0
intList = Array.ConvertAll(stringList, int.Parse).ToList();

0

Cela peut être exagéré pour ce problème simple. Mais pour les méthodes Try-Do en relation avec Linq, j'ai tendance à utiliser des classes anonymes pour un code plus expressif. C'est similaire aux réponses d' Olivier Jacot-Descombes et de 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
Pensez à ajouter des explications textuelles sur votre réponse, au lieu de fournir uniquement du code.
— carlosfigueira

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

Salut Patryk. Bienvenue dans StackOverflow. Ce serait mieux si vous pouviez écrire un peu plus de description de la solution assez concise que vous avez publiée. Ceci est la réponse à une question très ancienne sur ce site Web et serait examiné par plusieurs utilisateurs.
— Aditya
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.