วิธีการแปลง List <string> เป็น List <int>


157

คำถามของฉันเป็นส่วนหนึ่งของปัญหานี้:

ฉันได้รับคอลเล็กชัน id จากแบบฟอร์ม ฉันต้องได้รับกุญแจแปลงให้เป็นจำนวนเต็มและเลือกระเบียนที่ตรงกันจาก 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);
}

คำตอบ:


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

ยกเว้นยก - LINQ กับกิจการที่ไม่รู้จักวิธีการ 'Int32 IndexOf (Char) วิธีการและวิธีการนี้ไม่สามารถแปลเป็นการแสดงออกที่ร้านค้า .net 4.0
markthewizard1234

4
@ markthewizard1234 ที่จะเกิดขึ้นถ้าคุณlistofIDsเป็นIQueryable<string>ที่ยังไม่ได้รับการดำเนินการ ดำเนินการToList()ก่อนก่อนที่จะทำการแปลง:listofIDs.ToList().Select(int.Parse).ToList()
Michael Hornfeck

Im ว่าในปี 2013 นี้ทำงาน แต่ตอนนี้ไม่ได้ทำงานให้ฉัน เพิ่มตัวเลือกใหม่ด้านล่างโดยใช้คำสั่ง LINQ
Brandon Turpy

1
นี้จะโยนยกเว้นถ้าสตริงใด ๆ จะไม่เป็นจริง ints ดูรุ่นปลอดภัยลงมาด้านล่าง stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck ToList แรกควรเป็นจำนวนมากไม่จำเป็นต้องจัดสรรรายชื่อที่สอง
Ronan Thibaudau

38

ใช้ Linq ...

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

20

นี่คือตัวแปรที่ปลอดภัยที่กรอง ints ที่ไม่ถูกต้อง:

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

มันใช้outตัวแปรใหม่ที่นำมาใช้กับ C # 7.0

ตัวแปรอื่น ๆ กลับรายการของ ints nullable ที่nullรายการจะถูกแทรกสำหรับ ints ถูกต้อง (เช่นจะเก็บรักษานับรายการเดิม):

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

ขอบคุณมาก! เวอร์ชันสำหรับ C # 6.0 ด้านล่างstackoverflow.com/a/48712010/2340825
BA TabNabber


12

ไม่มี TryParse อะไรบ้าง รุ่น LINQ ที่ปลอดภัยซึ่งกรอง ints ที่ไม่ถูกต้อง (สำหรับ C # 6.0 และต่ำกว่า):

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

เครดิตให้กับโอลิเวีย Jacot-Descombes สำหรับความคิดและรุ่น C # 7.0


3

ฉันรู้ว่ามันเป็นโพสต์เก่า แต่ฉันคิดว่านี่เป็นส่วนเสริมที่ดี: คุณสามารถใช้ List<T>.ConvertAll<TOutput>

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

1

นี่คือวิธีที่ง่ายที่สุดที่ฉันคิดว่า:

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

6
ฉันเห็นชนิดของรูปแบบในการแสดงออกแลมบ์ดามักนี้: x => SomeMethod (x) คุณรู้ว่าคุณอาจจะแทนที่ด้วยSomeMethod เมื่อตัวอย่างของคุณกลายเป็นlistOfStrings.Select <string, int> (Convert.ToInt32); . ที่อาจอ่านได้มากขึ้นเร็วขึ้นสั้นและไม่ฉันแล้วพูดถึงสง่างามมากขึ้น? เช่นเดียวกันสำหรับคนอื่น ๆ ที่ตอบคำถามนี้
JBSnorro

ฉันได้รับข้อผิดพลาดเมื่อไม่ใช้ไวยากรณ์ลูกศร ใช้งานได้: List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));แต่สิ่งนี้ไม่ได้: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);ข้อผิดพลาดคือการโทรที่ไม่ชัดเจนระหว่างstring,int,intและstring,intรุ่นของ Select
goodeye

1

ค่าสตริงแปลงลงในรายการจำนวนเต็ม

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

วิธีการที่จะประสบความสำเร็จนี้ก็จะใช้คำสั่ง LINQ คำตอบที่แนะนำไม่ทำงานสำหรับฉันใน. NetCore2.0 ฉันสามารถคิดออกได้และข้างล่างจะใช้ได้ถ้าคุณใช้เทคโนโลยีใหม่กว่า

[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

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

ดูเหมือนว่าสิ้นเปลืองสวย TryParse ซึ่งจะช่วยให้คุณมีค่าแล้วก็โยนค่าที่ออกไปนอกหน้าต่างแล้วทำแยกวิเคราะห์ คุณแยกคู่เป็นหลัก
Ristogod


0

นี้อาจจะ overkill สำหรับปัญหานี้ง่าย แต่สำหรับวิธีลองใช้ที่เกี่ยวข้องกับ Linq ฉันมักจะใช้คลาสที่ไม่ระบุชื่อเพื่อให้ได้รหัสที่ชัดเจนยิ่งขึ้น มันคล้ายกับคำตอบจากโอลิเวีย Jacot-Descombesและบริติชแอร์เวย์ 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
ลองเพิ่มคำอธิบายที่เป็นข้อความเกี่ยวกับคำตอบของคุณแทนที่จะให้รหัสเท่านั้น
carlosfigueira

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

สวัสดีแพทริก ยินดีต้อนรับสู่ StackOverflow มันจะดีกว่าถ้าคุณสามารถเขียนคำอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับการแก้ปัญหากระชับสวยคุณโพสต์ นี่คือคำตอบของคำถามที่เก่ามากในเว็บไซต์นี้และจะถูกตรวจสอบโดยผู้ใช้หลายคน
Aditya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.