ไวยากรณ์ C # - แบ่งสตริงออกเป็นอาร์เรย์ด้วยเครื่องหมายจุลภาคแปลงเป็นรายการทั่วไปและลำดับย้อนกลับ


92

ไวยากรณ์ที่ถูกต้องสำหรับสิ่งนี้คืออะไร:

IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse();

ฉันทำอะไรลงไป? TSource หมายถึงอะไร?

คำตอบ:


254

ปัญหาคือคุณโทรมาList<T>.Reverse()ซึ่งจะกลับvoidมา

คุณสามารถทำได้:

List<string> names = "Tom,Scott,Bob".Split(',').ToList<string>();
names.Reverse();

หรือ:

IList<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>();

อย่างหลังนี้มีราคาแพงกว่าเนื่องจากการย้อนกลับโดยพลการIEnumerable<T>นั้นเกี่ยวข้องกับการบัฟเฟอร์ข้อมูลทั้งหมดแล้วให้ผลทั้งหมด - ในขณะที่List<T>สามารถทำการย้อนกลับ "ในตำแหน่ง" ได้ทั้งหมด (ความแตกต่างคือมันเรียกEnumerable.Reverse<T>()วิธีการขยายแทนที่จะเป็นList<T>.Reverse()วิธีการอินสแตนซ์)

ยังมีประสิทธิภาพมากขึ้นคุณสามารถใช้:

string[] namesArray = "Tom,Scott,Bob".Split(',');
List<string> namesList = new List<string>(namesArray.Length);
namesList.AddRange(namesArray);
namesList.Reverse();

วิธีนี้หลีกเลี่ยงการสร้างบัฟเฟอร์ที่มีขนาดไม่เหมาะสมโดยเสียค่าใช้จ่ายในการใช้งบสี่รายการซึ่งจะทำ ... เช่นเคยชั่งน้ำหนักความสามารถในการอ่านเทียบกับประสิทธิภาพในกรณีการใช้งานจริง


25
Skeet เป็นสัตว์ร้าย!
เนื้อ

2
อธิบายได้ดีฉันชื่นชมจริงๆ!
Gaurav Aroraa

11

ฉันรู้ว่าคำถามนี้ค่อนข้างเก่า แต่ฉันก็มีปัญหาเหมือนกันยกเว้นสตริงของฉันมีช่องว่างรวมอยู่ด้วย สำหรับผู้ที่ต้องการทราบวิธีแยกสตริงที่มีมากกว่าแค่ลูกน้ำ:

string str = "Tom, Scott, Bob";
  IList<string> names = str.Split(new string[] {","," "},
  StringSplitOptions.RemoveEmptyEntries);

StringSplitOptions ลบเร็กคอร์ดที่จะเป็นเพียงช่องว่าง char ...


สิ่งนี้จะไม่ได้ผลถ้าคุณมี "Tom Cruise" แทนที่จะเป็นแค่ Tom
สว่างไสว


2

ลองสิ่งนี้:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();

ฉันได้รับข้อผิดพลาด - ไม่สามารถแปลงประเภท 'void' โดยปริยายเป็น 'System.Collections.Generic.List <string>
BuddyJoe

1

สิ่งที่คุณขาดหายไปที่นี่คือ Reverse () เป็นวิธีโมฆะ ไม่สามารถกำหนดผลลัพธ์ของ. Reverse () ให้กับตัวแปรได้ อย่างไรก็ตามคุณสามารถเปลี่ยนลำดับเพื่อใช้ Enumerable.Reverse () และรับผลลัพธ์ของคุณ

var x = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>()

ความแตกต่างคือ Enumerable.Reverse () ส่งคืน IEnumerable <T> แทนที่จะเป็นผลตอบแทนที่เป็นโมฆะ


1

หากคุณกำลังพยายาม

  1. ใช้ตัวคั่นหลายตัว
  2. กรองสตริงว่าง ๆ
  3. ตัดแต่งช่องว่างนำหน้า / ต่อท้าย

สิ่งต่อไปนี้ควรใช้งานได้:

string str = "Tom Cruise, Scott, ,Bob | at";
IEnumerable<string> names = str
                            .Split(new char[]{',', '|'})
                            .Where(x=>x!=null && x.Trim().Length > 0)
                            .Select(x=>x.Trim());

เอาต์พุต

  • ทอม
  • ล่องเรือ
  • สก็อตต์
  • บ๊อบ
  • ที่

ตอนนี้คุณสามารถย้อนกลับลำดับตามที่คนอื่นแนะนำได้อย่างชัดเจน

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