แปลงสตริงเป็น List <string> ในหนึ่งบรรทัด?


108

ฉันมีสตริง:

var names = "Brian,Joe,Chris";

มีวิธีแปลงค่านี้เป็นList<string>ตัวคั่นด้วย,บรรทัดเดียวหรือไม่?


15
ฉันไม่เข้าใจข้อกำหนด "ในบรรทัดเดียว" ยิงเพื่อเขียนโค้ดที่ชัดเจนและเข้าใจได้ไม่ใช่วิธีที่จะพอดีกับการทำงานในพื้นที่ขนาดเล็กที่สุด
Ed S.

6
ด้วยการถือกำเนิดของ LINQ "หนึ่งสมุทร" ที่อ่านได้และสะอาดกลายเป็นเรื่องปกติมากขึ้นใน C # IMO
Matt Greer

5
@ เอ็ดเอส - แม้ว่าฉันจะยอมรับว่า "ในบรรทัดเดียว" อาจไม่ใช่วิธีที่ดีที่สุด แต่ข้อความบรรทัดเดียวอย่างที่ Matt Greer ระบุไว้มักจะชัดเจนและเข้าใจได้มาก ฉันเดาว่าเขาแค่ต้องการหลีกเลี่ยงการใช้forลูปซึ่งน่าเบื่อกว่ามีโอกาสผิดพลาดและไม่ชัดเจน
StriplingWarrior

4
ฉันไม่ได้ตั้งใจจะบอกว่าหนึ่งสมุทรนั้นยากที่จะเข้าใจโดยเนื้อแท้ฉันแค่บอกว่ามันไม่ควรเป็นข้อกำหนด เพียงทำวิธีที่ดีที่สุดเท่าที่มีอยู่ หากสิ่งนี้เป็นบรรทัดเดียวก็ดี แต่ไม่ใช่สิ่งที่ควรกำหนดรูปแบบการเขียนโค้ดของคุณ
Ed S.

คำตอบ:


205
List<string> result = names.Split(new char[] { ',' }).ToList();

หรือสะอาดกว่าด้วยคำแนะนำของ Dan:

List<string> result = names.Split(',').ToList();

11
คุณอาจตั้งใจไว้ที่นั่น แต่ฉันมักจะทิ้งnew char[] { }ส่วนทั้งหมดไว้ อย่างน้อยก็อ่านได้มากขึ้นสำหรับฉัน
ด่านเต๋า

4
@ แดน: ฉันเห็นด้วยและโดยทั่วไปฉันใช้ params มากเกินไป แต่สำหรับคำตอบสำหรับคำถามบางครั้งฉันรู้สึกว่าการใช้คำฟุ่มเฟือยนั้นดีกว่า แค่เรื่องของความคิดเห็นจริงๆ
Matt Greer

4
ToList () ดูเหมือนจะไม่มีประโยชน์อีกต่อไป?
Gina Marano

11
คุณนำSystem.LINQเนมสเปซเข้ามาหรือไม่?
Matt Greer


3

ฉันชอบสิ่งนี้เพราะมันป้องกันไม่ให้รายการเดียวที่มีรายการว่างถ้าสตริงต้นทางของคุณว่างเปล่า:

  IEnumerable<string> namesList = 
      !string.isNullOrEmpty(names) ? names.Split(',') : Enumerable.Empty<string>();



0

หากคุณมีรายการและต้องการที่จะเพิ่มค่าจากสตริงคั่นคุณสามารถใช้หรือAddRange InsertRangeตัวอย่างเช่น:

existingList.AddRange(names.Split(','));

0

ใช้แพ็กเกจ Stringify.Library nuget

//Default delimiter is ,
var split = new StringConverter().ConvertTo<List<string>>(names);

//You can also have your custom delimiter for e.g. ;
var split = new StringConverter().ConvertTo<List<string>>(names, new ConverterOptions { Delimiter = ';' });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.