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.