Jak przekonwertować List <string> na List <int>?


157

Moje pytanie jest częścią tego problemu:

Otrzymałem zbiór identyfikatorów z formularza. Muszę zdobyć klucze, przekonwertować je na liczby całkowite i wybrać pasujące rekordy z bazy danych.

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

Odpowiedzi:


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

Zgłoszono wyjątek - LINQ to Entities nie rozpoznaje metody `` Int32 IndexOf (Char) '', a tej metody nie można przetłumaczyć na wyrażenie magazynu. .net 4.0
markthewizard1234

4
@ markthewizard1234 Stanie się tak, jeśli Twój listofIDsjest IQueryable<string>niezrealizowany. Wykonaj go najpierw ToList()przed wykonaniem konwersji:listofIDs.ToList().Select(int.Parse).ToList()
Michael Hornfeck

Jestem pewien, że w 2013 roku to zadziałało, ale to już nie działało. Dodano nowszą opcję poniżej za pomocą instrukcji linq.
Brandon Turpy

1
Spowoduje to zgłoszenie wyjątku, jeśli którykolwiek z ciągów nie jest w rzeczywistości int. Zobacz bezpieczne wersje poniżej. stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck Pierwsza lista ToList powinna być AsEnumerable, nie ma potrzeby przydzielania drugiej listy
Ronan Thibaudau

38

Korzystanie z Linq ...

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

20

Oto bezpieczny wariant, który odfiltrowuje nieprawidłowe int:

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

Używa nowego out zmiennych wprowadzonych w C # 7.0.

Ten inny wariant zwraca listę liczb całkowitych dopuszczających wartość null, w których nullwpisy są wstawiane dla nieprawidłowych liczb całkowitych (tj. Zachowuje oryginalną liczbę list):

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

Wielkie dzięki! Wersja dla C # 6.0 poniżej stackoverflow.com/a/48712010/2340825
BA TabNabber

13

Korzystanie z Linq:

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

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

12

Co nie TryParse? Bezpieczna wersja LINQ, która odfiltrowuje nieprawidłowe wartości int (dla C # 6,0 i poniżej):

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

Podziękowania dla Oliviera Jacota-Descombesa za pomysł i wersję C # 7.0.



1

Myślę, że to najprostszy sposób:

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

6
Często widzę tego rodzaju wzorzec w wyrażeniach lambda: x => someMethod (x) . Wiesz, że prawdopodobnie powinieneś zamienić to na someMethod . W ten sposób Twój przykład stanie się listOfStrings.Select <string, int> (Convert.ToInt32); . To chyba bardziej czytelne, szybsze, krótsze i czy wspominałem już o bardziej eleganckim? To samo dotyczy wszystkich innych osób odpowiadających na to pytanie.
JBSnorro

Podczas pomijania składni strzałki pojawia się błąd. To działa, List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));ale to nie działa: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);Błąd jest niejednoznacznym wywołaniem między wersjami string,int,inti string,intSelect.
goodeye,

1

Konwertuj wartość ciągu na listę liczb całkowitych

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

Innym sposobem osiągnięcia tego byłoby użycie instrukcji linq. Rekomendowana odpowiedź nie działa dla mnie w .NetCore2.0. Udało mi się to jednak rozgryźć, a poniżej również zadziała, jeśli używasz nowszej technologii.

[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

Możesz go używać za pośrednictwem LINQ

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

Wydaje się to dość marnotrawne dla TryParse, które podaje wartość, a następnie po prostu wyrzuć tę wartość przez okno, aby wykonać analizę. Zasadniczo analizujesz podwójnie.
Ristogod


0

Może to być przesada w przypadku tego prostego problemu. Ale w przypadku metod Try-Do w połączeniu z Linq, staram się używać klas anonimowych dla bardziej wyrazistego kodu. Jest podobny do odpowiedzi Oliviera Jacota-Descombesa i BA TabNabbera :

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
Zastanów się nad dodaniem wyjaśnień w formie tekstu, zamiast podawania samego kodu.
carlosfigueira

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

Cześć Patryk. Witamy w StackOverflow. Byłoby lepiej, gdybyś mógł napisać trochę więcej opisu dość zwięzłego rozwiązania, które opublikowałeś. To jest odpowiedź na bardzo stare pytanie w tej witrynie i zostało sprawdzone przez kilku użytkowników.
Aditya
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.