Cú pháp C # - Chia chuỗi thành mảng bằng dấu phẩy, chuyển đổi thành danh sách chung và đảo ngược thứ tự


92

Cú pháp chính xác cho điều này là gì:

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

Tôi đang làm gì vậy? TSource có nghĩa là gì?

Câu trả lời:


253

Vấn đề là bạn đang gọi List<T>.Reverse()mà trả về void.

Bạn có thể làm:

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

hoặc là:

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

Cách thứ hai đắt hơn, vì việc đảo ngược một tùy ý IEnumerable<T>liên quan đến việc lưu vào bộ đệm tất cả dữ liệu và sau đó mang lại tất cả - trong khi List<T>có thể thực hiện tất cả việc đảo ngược "tại chỗ". (Sự khác biệt ở đây là nó đang gọi Enumerable.Reverse<T>()phương thức mở rộng, thay vì List<T>.Reverse()phương thức cá thể.)

Hiệu quả hơn, bạn có thể sử dụng:

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

Điều này tránh tạo ra bất kỳ bộ đệm nào có kích thước không phù hợp - với chi phí là lấy bốn câu lệnh mà một câu sẽ làm ... Như mọi khi, hãy cân nhắc khả năng đọc so với hiệu suất trong trường hợp sử dụng thực.


25
xiên là một con quái vật!
thịt

2
cũng được xây dựng kỹ lưỡng, tôi thực sự đánh giá cao!
Gaurav Aroraa

11

Tôi nhận ra rằng câu hỏi này khá cũ, nhưng tôi đã gặp vấn đề tương tự, ngoại trừ chuỗi của tôi có khoảng trắng trong đó. Đối với những người cần biết cách phân tách một chuỗi không chỉ bằng dấu phẩy:

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

StringSplitOptions loại bỏ các bản ghi chỉ là ký tự khoảng trắng ...


Điều này sẽ không hoạt động nếu bạn có "Tom Cruise" thay vì chỉ có Tom
bốc cháy vào

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

Cái này hoạt động.


1

Thử cái này:

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

Tôi nhận được lỗi - Không thể chuyển đổi ngầm gõ 'khoảng trống' thành 'System.Collections.Generic.List <string>
BuddyJoe

1

Điều bạn còn thiếu ở đây là .Reverse () là một phương thức void. Không thể gán kết quả của .Reverse () cho một biến. Tuy nhiên, bạn có thể thay đổi thứ tự để sử dụng Enumerable.Reverse () và nhận kết quả của bạn

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

Sự khác biệt là Enumerable.Reverse () trả về IEnumerable <T> thay vì trả về void


1

Nếu bạn đang cố gắng

  1. Sử dụng nhiều dấu phân cách
  2. Lọc bất kỳ chuỗi trống nào
  3. Cắt bỏ khoảng trắng ở đầu / cuối

sau đây sẽ hoạt động:

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

Đầu ra

  • Tom
  • Du thuyền
  • Scott
  • Bob
  • tại

Bây giờ bạn rõ ràng có thể đảo ngược thứ tự như những người khác đề xuất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.