แยกสตริงแปลง ToList <int> () ในหนึ่งบรรทัด


192

ฉันมีสตริงที่มีตัวเลข

string sNumbers = "1,2,3,4,5";

ฉันสามารถแยกมันแล้วแปลงเป็น List<int>

sNumbers.Split( new[] { ',' } ).ToList<int>();

ฉันจะแปลงอาร์เรย์สตริงเป็นรายการจำนวนเต็มได้อย่างไร เพื่อที่ฉันจะสามารถแปลงstring[]เป็นIEnumerable


วันนี้เรามีคำถามเดียวกันทั้งหมด: คลิกฉัน
Dario

3
ใน "หนึ่งบรรทัด" ศรีที่แข็งแกร่งมากเป็นข้อกำหนดที่เข้มงวดมาก! </perl>
2552

2
คำถามนี้พูดโดยเฉพาะเพื่อแบ่งสตริงของตัวเลขซึ่งทำให้คำตอบนั้นง่าย คำถามที่ Dario พูดถึงการจัดการ (bogs down in?) ปัญหาของ TryParse สำหรับสตริงทั่วไป
goodeye

คำตอบ:


467
var numbers = sNumbers.Split(',').Select(Int32.Parse).ToList();

4
สิ่งนี้จะได้รับการยกเว้นเมื่อรายการมีค่าว่างเปล่าหรือว่างเปล่า
มูฮัมหมัด Idrees

@ SayedM.Idrees เพียงตรวจสอบโมฆะหรือว่างเปล่าก่อนที่จะแยก
RAVI VAGHELA

31

คุณสามารถทำได้โดยไม่ต้องใช้ Linq:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

// Uses Linq
var numbers = Array.ConvertAll(sNumbers.Split(','), int.Parse).ToList();

18

วิธีของ Joze ต้องการ LINQ ToList()อยู่ในSystem.Linqnamespace

คุณสามารถแปลง Array เป็น List โดยไม่ต้อง Linq โดยส่ง array ไปยัง List constructor:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

18

ใช้ดีกว่าint.TryParseเพื่อหลีกเลี่ยงข้อยกเว้น;

var numbers = sNumbers
            .Split(',')
            .Where(x => int.TryParse(x, out _))
            .Select(int.Parse)
            .ToList();

10

นอกจากนี้ยังเป็นไปได้ที่จะใช้อาร์เรย์เพื่อกำหนดค่าโดยตรง

แบบนี้

int[] numbers = sNumbers.Split(',').Select(Int32.Parse).ToArray();

4

นอกจากนี้คุณสามารถใช้วิธีการขยายนี้

public static List<int> SplitToIntList(this string list, char separator = ',')
{
    return list.Split(separator).Select(Int32.Parse).ToList();
}

การใช้งาน:

var numberListString = "1, 2, 3, 4";
List<int> numberList = numberListString.SplitToIntList(',');

3

ใน Unity3d int.Parseทำงานได้ไม่ดี ดังนั้นฉันใช้เหมือนร้อง

List<int> intList = new List<int>( Array.ConvertAll(sNumbers.Split(','),
 new Converter<string, int>((s)=>{return Convert.ToInt32(s);}) ) );

หวังว่าความช่วยเหลือนี้สำหรับผู้ใช้ Unity3d


3

คุณสามารถใช้คุณสมบัติภาษา C # 6.0 ใหม่:

  • แทนที่ผู้รับมอบสิทธิ์(s) => { return Convert.ToInt32(s); }ด้วยกลุ่มวิธีการที่สอดคล้องกันConvert.ToInt32
  • แทนที่ call constructor ที่ซ้ำซ้อน: new Converter<string, int>(Convert.ToInt32)ด้วย:Convert.ToInt32

ผลลัพธ์จะเป็น:

var intList = new List<int>(Array.ConvertAll(sNumbers.Split(','), Convert.ToInt32));

2

ปัญหาของฉันคล้ายกัน แต่ด้วยความไม่สะดวกที่บางครั้งสตริงมีตัวอักษร (บางครั้งว่างเปล่า)

string sNumbers = "1,2,hh,3,4,x,5";

พยายามที่จะปฏิบัติตามวิธีการขยาย Pcode Xonos:

public static List<int> SplitToIntList(this string list, char separator = ',')
{
      int result = 0;
      return (from s in list.Split(',')
              let isint = int.TryParse(s, out result)
              let val = result
              where isint
              select val).ToList(); 
}

1
ขอบคุณแม้ว่าคุณจะประกาศตัวคั่นแล้วคุณจะไม่ใช้มัน
Hugo Delsing

-2

คุณสามารถใช้สิ่งนี้:

List<Int32> sNumberslst = sNumbers.Split(',').ConvertIntoIntList();

2
ยินดีต้อนรับสู่ Stack Overflow! ในขณะที่ข้อมูลโค้ดนี้อาจแก้ไขคำถามรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ โปรดอย่าพยายามทำให้รหัสของคุณแน่นเกินไปด้วยคำอธิบายที่อธิบายเนื่องจากจะช่วยลดความสามารถในการอ่านของทั้งรหัสและคำอธิบาย!
ลา StackExchange

2
ฟังก์ชัน ConvertIntoIntList ไม่ออก
Federico Navarrete

นอกจากนี้คุณต้องเพิ่มคลาสต่อไปนี้: คลาสสาธารณะแบบคงที่ HelperMethods {รายการสาธารณะคงที่ <int> ConvertIntoIntList (สตริงนี้ [] stringList) {int x = 0; var intList = stringList.Where (str => int.TryParse (str, out x)) เลือก (str => x) .ToList (); กลับ intList; }}
Federico Navarrete
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.