2011-06-01 20 views
114

Soruma ilişkin şu soruya bir sorunum var:Liste <string> Listesinin <int> Listesini Nasıl Dönüştürülür?

Bir formdaki id topluluğunu aldım. Anahtarları almam, tam sayılara dönüştürmem ve DB'den gelen kayıtları seçmem gerekiyor. Linq kullanarak

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

cevap

270
listofIDs.Select(int.Parse).ToList() 
+0

İstisna kaldırıldı - LINQ - Varlıklar, 'Int32 IndexOf (Char)' yöntemini tanımıyor ve bu yöntem bir mağaza ifadesine dönüştürülemiyor. .net 4.0 – markthewizard1234

+1

@ markthewizard1234 Bu, "listofIDs" iniz yürütülemeyen bir "IQueryable " olması durumunda gerçekleşir. Dönüştürme işlemini yapmadan önce 'ToList()' ile önce çalıştırın: 'listofIDs.ToList(). Select (int.Parse) .ToList()' –

+1

didn'it benim için çalıştınız – fnc12

31

...

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

:

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

Bu, ben basit yolu düşünüyorum edilir:

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

Genellikle lambda ifadelerinde bu tür bir deseni görüyorum: _x => someMethod (x) _. Bunu muhtemelen _someMethod_ ile değiştirmeniz gerektiğini biliyorsunuz. Bu örnek ile _listOfStrings olur. (Convert.ToInt32); _. Muhtemelen daha okunaklı, daha hızlı, daha kısadır ve daha zarif bir şekilde bahsetmiş miydim? Aynı şey, bu soruyu cevaplayan diğer herkes için de geçerlidir. – JBSnorro

+0

Ok söz dizimini atlarken bir hata alıyorum. Bu çalışır: 'Liste sss = yeni Liste ();' 'IEnumerable test1 = sss.Select (x => Convert.ToInt32 (x));' ancak bu yok: 'IEnumerable test2 = sss.Select (Convert.ToInt32); 'Hata, select dizesi, int, int ve string, int' sürümleri arasında belirsiz bir çağrıdır. – goodeye

-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

Yanıtınızı yalnızca kod sağlamak yerine, bazı metin açıklamaları eklemeyi düşünün. – carlosfigueira

-2
list<int> integersList = decimalList.cast<int>().ToList() 

Eğer null tip varsa, o zaman '?' Önümüzdeki

list<int?> integersList = decimalList.cast<int?>().ToList() 
+2

Dizelerin bir listesi var, int için kullanılamazlar. – Vache

3

gibi türünün, I eski yazı var biliyorum, ama bu iyi bir ektir düşündüm: Sen List<T>.ConvertAll<TOutput> İşte

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

filtreleyen bir güvenli türüdür kullanabilirsiniz geçersiz 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(); 

O C# 7.0 ile sunulan yeni out değişkenleri kullanır. Bu linq deyimi kullanarak olacaktır gerçekleştirmek için

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

Güzel cevap! Seni kimin (ve neden?) Reddettiğini bilmiyorum ama benim hakkımı kabul et. –

+0

Harika teşekkürler! Https://stackoverflow.com/a/48712010/2340825 altında C# 6.0 sürümü –

0

başka bir yolu:

Bu, diğer varyant null girişler geçersiz ints yerleştirilir null ints listesini (başka bir deyişle, orijinal liste sayısını muhafaza eder) döndürür. Tavsiye edilen cevap benim için işe yaramadı. NetCore2.0. Ancak bunu anlayabildim ve daha yeni bir teknoloji kullanıyorsanız, aşağıda da çalışırdı.

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

Ne TryParse? (Aşağıdaki C# 6.0 ve için) geçersiz int'leri filtreleyen Güvenli LINQ versiyonu: fikir için Olivier Jacot-Descombes 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(); 

kredi ve C# 7.0 sürümü.

İlgili konular