ฉันจะแปลงสตริงที่คั่นด้วยเครื่องหมายจุลภาคเป็นรายการ <int> ได้อย่างไร


199
string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',');

วิธีนี้ใช้ไม่ได้เนื่องจากวิธีการแบ่งส่งคืนสตริง []



คำตอบ:


432

นี่คือวิธีหนึ่งในการทำ:

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

11
นั่นอาจเป็นList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog

2
จำเป็นnew List<>หรือไม่
LiquidPony

2
@ LiquidPony ไม่; คุณสามารถโทรหาToList()แทน ผลลัพธ์จะเหมือนกัน: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); คุณต้องทำอย่างใดอย่างหนึ่ง แต่เนื่องจากค่าส่งคืนของSelect()คือIEnumerable<>แต่ไม่ใช่List<>
phoog

@ LiquidPony ในการนำไปใช้นี้ใช่เนื่องจากSelectส่วนขยายในกรณีนี้ส่งคืนIEnumerable<Int32>และไม่มีอยู่ในรายการ อย่างไรก็ตามรายการมีตัวสร้างที่รับคอลเลกชันอื่นเป็นแหล่งที่มา
Oybek

8
เพื่อจัดการกรณีที่แท็กเป็นสตริงว่างให้ใช้Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

24

หากคุณต้องการรวมการตรวจสอบความถูกต้องบางอย่างและข้ามค่าที่ไม่ถูกต้อง (แทนที่จะโยนข้อยกเว้น) นี่คือสิ่งที่ใช้ TryParse:

string csv = "1,2,3,4,a,5";
int mos = 0;
var intList = csv.Split(',')
                    .Select(m => { int.TryParse(m, out mos); return mos; })
                    .Where(m => m != 0)
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5

แก้ไข:นี่คือแบบสอบถามที่อัปเดตซึ่งอิงตามความคิดเห็นจากแอนทอน มันเรียก TryParse ก่อนเพื่อกรองค่าที่ไม่ดีใด ๆ แล้วแยกวิเคราะห์เพื่อทำการแปลงจริง

string csv = "1,2,3,4,a,5,0,3,r,5";
int mos = 0;
var intList = csv.Split(',')
                    .Where(m => int.TryParse(m, out mos))
                    .Select(m => int.Parse(m))
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5

แก้ไข 2:ข้อความค้นหาที่อัปเดตสำหรับ C # 7.0 ขอบคุณคำติชมจาก Charles Burns โปรดทราบว่าเรากำจัดตัวแปรเสริม mos ด้วยวิธีนี้ดังนั้นมันจึงค่อนข้างสะอาดกว่า

string csv = "1,2,3,4,a,5,0,3,r,5";
var intList = csv.Split(',')
                 .Where(m => int.TryParse(m, out _))
                 .Select(m => int.Parse(m))
                 .ToList();

1
ล้มเหลวถ้า 0 เป็นข้อมูลป้อนเข้าที่ถูกต้องเดียว!
Antoine Meltzheim

2
ด้วย C # 7.0 คุณสามารถละเว้นการประกาศของ mos และแทนที่การโทร TryParse ด้วยint.TryParse(m, out int _)
Charles Burns

14

คุณสามารถใช้ LINQ w / int.Parse()เพื่อแปลงstring[]เป็นIEnumerable<int>แล้วส่งผ่านผลลัพธ์นั้นไปยังตัวList<T>สร้าง:

var tagIds = new List<int>(tags.Split(',').Select(s => int.Parse(s)));


6

หากไม่มี LINQ Query คุณสามารถเลือกวิธีนี้ได้

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

แล้วคุณสามารถแปลงรายการนี้เป็นประเภทจำนวนเต็ม ...


แค่ทราบถึงทุกคนที่ไม่คุ้นเคย = .ToList<string>()ยังต้องการusing System.Linq;
Bill Rawlinson


2

หากคุณใช้ C # 3.5 คุณสามารถใช้ Linq เพื่อให้ได้สิ่งนี้

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

หรือสั้น ๆ

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();


1

ฉันได้ทำการดัดแปลงคำตอบของ khalid13 หากผู้ใช้ใส่สตริง "0" คำตอบของเขาจะลบออกจากรายการผลลัพธ์ ฉันทำสิ่งที่คล้ายกัน แต่ใช้วัตถุที่ไม่ระบุชื่อ

var result = commaSeparatedString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(s => new { didConvert = int.TryParse(s.TrimNullProtection(), out convertedInt), convertedValue = convertedInt })
            .Where(w => w.didConvert)
            .Select(s => s.convertedValue)
            .ToList();

TrimNullProtection เป็นฟังก์ชั่นที่กำหนดเองที่ฉันทำซึ่งปกป้องถ้าสตริงเป็นโมฆะ

สิ่งที่กล่าวมาข้างต้นคือตัดสายอักขระที่ไม่สามารถแปลงได้โดยไม่มีข้อผิดพลาด หากคุณต้องการข้อผิดพลาดหากมีปัญหากับการแปลงแล้วคำตอบที่ยอมรับได้ควรทำเคล็ดลับ


1

ฉันสะดุดเมื่อนี้และฉันต้องการแบ่งปันโซลูชันของตัวเองโดยไม่ต้อง linq นี่คือวิธีการดั้งเดิม ค่าที่ไม่ใช่จำนวนเต็มจะไม่ถูกเพิ่มในรายการด้วย

List<int> TagIds = new List<int>();
string[] split = tags.Split(',');
foreach (string item in split)
{
    int val = 0;
    if (int.TryParse(item, out val) == true)
    {
        TagIds.Add(val);
    }
}

หวังว่านี่จะช่วยได้


-2

มันง่ายมาก ก่อนอื่นให้แยกสตริง ตัดพื้นที่ว่างที่มีอยู่หลังเครื่องหมายจุลภาค (,) จากนั้นใช้ระบบที่กำหนดไว้ ToList ()

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

หากต้องการลบช่องว่างหลัง ',' และแปลงข้อความที่คั่นด้วยเครื่องหมายจุลภาคนี้เป็นรายการ

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.