<string> Listesini <int> Listesine nasıl dönüştürebilirim?


157

Benim sorum bu sorunun bir parçası:

Bir formdan kimlik koleksiyonu alıyorum. Anahtarları almak, tamsayılara dönüştürmek ve DB eşleşen kayıtları seçmek gerekir.

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

Yanıtlar:


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

Özel durum oluştu - LINQ to Entities, 'Int32 IndexOf (Char)' yöntemini tanımıyor ve bu yöntem bir mağaza ifadesine çevrilemiyor. .net 4.0
markthewizard1234

4
@ markthewizard1234 Eğer sizin listofIDsbir IQueryable<string>idam henüz yürütülmemişse olur. ToList()Dönüşümü yapmadan önce ilk önce çalıştırın:listofIDs.ToList().Select(int.Parse).ToList()
Michael Hornfeck

Eminim 2013 yılında bu işe yaradı, ama bu artık benim için işe yaramadı. Linq deyimini kullanarak aşağıya daha yeni bir seçenek eklendi.
Brandon Turpy

1
Bu, dizelerden herhangi biri aslında ints değilse bir istisna atar. Aşağıdaki güvenli sürümlere bakın. stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck İlk ToList AsEnumerable olmalıdır, ikinci bir Liste ayırmaya gerek yok
Ronan Thibaudau

38

Linq kullanılıyor ...

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

20

İşte olan güvenli geçersiz int'leri filtreleyen varyantı:

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

outC # 7.0 ile sunulan yeni değişkenleri kullanır .

Bu diğer varyant nullgeçersiz girişler için girişlerin eklendiği null olabilecek girişlerin bir listesini döndürür (yani orijinal liste sayısını korur):

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

Çok teşekkürler! Aşağıdaki C # 6.0 sürümü için stackoverflow.com/a/48712010/2340825
BA TabNabber

13

Linq kullanma:

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

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

12

TryParse nedir? Geçersiz girişleri filtreleyen güvenli LINQ sürümü (C # 6.0 ve altı için):

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

Fikir ve C # 7.0 sürümü için Olivier Jacot-Descombes'e teşekkür ederiz.



1

Bence bu en basit yol:

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

6
Bu tür bir deseni lambda ifadelerinde sık sık görüyorum: x => someMethod (x) . Muhtemelen bunu someMethod ile değiştirmeniz gerektiğini biliyorsunuz . Bununla örneğin örneği listOfStrings.Select <string, int> (Convert.ToInt32); . Muhtemelen daha kolay okunabilir, daha hızlı, daha kısa ve daha zarif birinden bahsettim mi? Aynı şey bu soruyu cevaplayan diğer herkes için de geçerlidir.
JBSnorro

Ok sözdizimini atlarken bir hata alıyorum. Bu işe yarar: List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));ancak bu işe yaramaz: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);Hata, Select string,int,intve string,intsürümleri arasındaki belirsiz çağrıdır .
goodeye

1

Dize değerini tamsayı listesine dönüştürme

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

Bunu başarmanın başka bir yolu da linq deyimi kullanmaktır. Tavsiye edilen cevap .NetCore2.0'da benim için çalışmadı. Ancak bunu anlayabildim ve daha yeni bir teknoloji kullanıyorsanız, aşağıda da işe yarayacaktır.

[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 ile kullanabilirsiniz

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

Size değer veren TryParse için oldukça savurgan görünüyor, sonra sadece bir ayrıştırma yapmak için bu değeri pencereden dışarı atın. Temelde çift ayrıştırma yapıyorsunuz.
Ristogod

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

0

Bu basit problem için aşırıya kaçabilir. Ancak Linq ile bağlantılı Try-Do yöntemleri için, daha anlamlı kod için anonim sınıflar kullanma eğilimindeyim. Olivier Jacot-Descombes ve BA TabNabber'ın cevaplarına benzer :

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
Cevabınız hakkında yalnızca kod vermek yerine metinsel bir açıklama eklemeyi düşünün.
carlosfigueira

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

Merhaba Patryk. StackOverflow'a hoş geldiniz. Gönderdiğiniz oldukça özlü çözüm hakkında biraz daha fazla açıklama yazmanız daha iyi olurdu. Bu, bu web sitesindeki çok eski bir sorunun cevabıdır ve birkaç kullanıcı tarafından incelenecektir.
Aditya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.