Bagaimana cara mengubah List <string> ke List <int>?


157

Pertanyaan saya adalah bagian dari masalah ini:

Saya menerima koleksi id dari formulir. Saya perlu mendapatkan kunci, mengubahnya menjadi bilangan bulat dan memilih catatan yang cocok dari DB.

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

Jawaban:


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

Pengecualian yang diajukan - LINQ ke Entitas tidak mengenali metode metode 'Int32 IndexOf (Char)', dan metode ini tidak dapat diterjemahkan ke dalam ekspresi toko. .net 4.0
markthewizard1234

4
@ markthewizard1234 Itu akan terjadi jika Anda listofIDsseorang IQueryable<string>yang belum dieksekusi. Jalankan terlebih dahulu dengan ToList()sebelum Anda melakukan konversi:listofIDs.ToList().Select(int.Parse).ToList()
Michael Hornfeck

Saya yakin pada 2013 ini berhasil, tetapi ini tidak lagi berhasil untuk saya. Menambahkan opsi yang lebih baru di bawah ini menggunakan pernyataan LINQ.
Brandon Turpy

1
Ini akan memberikan pengecualian jika salah satu string tidak benar-benar int. Lihat versi aman di bawah. stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck ToList pertama harus AsEnumerable, tidak perlu mengalokasikan Daftar kedua
Ronan Thibaudau

38

Menggunakan Linq ...

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

20

Berikut adalah varian aman yang memfilter int yang tidak valid:

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

Ini menggunakan outvariabel baru yang diperkenalkan dengan C # 7.0.

Varian lain ini mengembalikan daftar int nullable di mana nullentri disisipkan untuk int tidak valid (yaitu mempertahankan jumlah daftar asli):

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

Terima kasih banyak! Versi untuk C # 6.0 di bawah stackoverflow.com/a/48712010/2340825
BA TabNabber

13

Menggunakan Linq:

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

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

12

Apa yang tidak TryParse? Versi LINQ aman yang memfilter int tidak valid (untuk C # 6.0 dan di bawah):

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

kredit untuk Olivier Jacot-Descombes untuk ide dan versi C # 7.0.


3

Saya tahu ini posting lama, tetapi saya pikir ini adalah tambahan yang bagus: Anda dapat menggunakan List<T>.ConvertAll<TOutput>

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

1

Ini adalah cara paling sederhana, saya pikir:

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

6
Saya sering melihat pola seperti ini dalam ekspresi lambda: x => someMethod (x) . Anda tahu Anda mungkin harus menggantinya dengan beberapa Metode . Dengan itu contoh Anda menjadi listOfStrings. Pilih <string, int> (Convert.ToInt32); . Itu mungkin lebih mudah dibaca, lebih cepat, lebih pendek dan apakah saya sudah menyebutkan lebih elegan? Hal yang sama berlaku untuk semua orang lain yang menjawab pertanyaan ini.
JBSnorro

Saya mendapatkan kesalahan saat menghilangkan sintaks panah. Ini berfungsi: List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));tetapi ini tidak: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);Kesalahan adalah panggilan ambigu antara versi string,int,intdan dan string,intPilih.
selamat tinggal

1

Ubah nilai string menjadi daftar integer

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

Cara lain untuk mencapai ini adalah dengan menggunakan pernyataan LINQ. Jawaban yang disarankan tidak berfungsi untuk saya di .NetCore2.0. Namun saya dapat mengetahuinya dan di bawah ini juga akan berfungsi jika Anda menggunakan teknologi yang lebih baru.

[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

Anda dapat menggunakannya melalui LINQ

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

Tampaknya cukup sia-sia untuk TryParse, yang memberi Anda nilai, kemudian cukup membuang nilai itu ke luar jendela untuk kemudian melakukan Parse. Anda pada dasarnya parsing ganda.
Ristogod

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

0

Ini mungkin berlebihan untuk masalah sederhana ini. Tetapi untuk metode Try-Do sehubungan dengan Linq, saya cenderung menggunakan kelas anonim untuk kode yang lebih ekspresif. Ini mirip dengan jawaban dari Olivier Jacot- Descombes dan 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
Pertimbangkan untuk menambahkan beberapa penjelasan tekstual tentang jawaban Anda, alih-alih hanya memberikan kode.
carlosfigueira

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

Hai Patryk. Selamat datang di StackOverflow. Akan lebih baik jika Anda bisa menulis deskripsi lebih banyak tentang solusi ringkas yang telah Anda posting. Ini adalah jawaban untuk pertanyaan yang sangat lama di situs web ini dan akan ditinjau oleh beberapa pengguna.
Aditya
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.