Tôi biết khái niệm String.Split đã được giải quyết trước với vô số các cách tiếp cận khác nhau, nhưng tôi đặc biệt quan tâm đến giải pháp LINQ cho câu hỏi này.Chia chuỗi thành danh sách các chuỗi có độ dài bằng cách sử dụng LINQ
Tôi đã cố gắng viết một lớp mở rộng để xử lý việc chia tách, nhưng cả hai lần thử đều có một số vấn đề lớn. Vì vậy, sau:
string s = "ABCDEFGHIJKLMNOPQRSTUVWX";
var results = s.SplitEvery(4);
tôi muốn một danh sách như: { "ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX"}
đây là lớp mở rộng của tôi:
public static class Extensions
{
public static List<string> SplitEvery(this string s, int n)
{
List<string> list = new List<string>();
var Attempt1 = s.Select((c, i) => i % n== 0 ? s.Substring(i, n) : "|").Where(x => x != "|").ToList();
var Attempt2 = s.Where((c, i) => i % n== 0).Select((c, i) => s.Substring(i, n)).ToList();
return list;
}
}
Cố gắng 1 chèn một chuỗi giả "|" mỗi khi điều kiện không được đáp ứng, sau đó loại bỏ tất cả các trường hợp của chuỗi giả để tạo danh sách cuối cùng. Nó hoạt động, nhưng việc tạo ra các chuỗi xấu có vẻ như một bước bổ sung không cần thiết. Hơn nữa, nỗ lực này thất bại nếu chuỗi không chia hết cho n. Cố gắng 2 là tôi đang cố gắng để lựa chọn chỉ nền mà chỉ số có thể chia hết cho N, nhưng giá trị 'i' trong câu lệnh Select không tương ứng với giá trị 'i' trong câu lệnh Where, vì vậy tôi nhận được kết quả như: {"ABCD", "BCDE", v.v ...}
Tôi cảm thấy mình gần gũi với một giải pháp tốt, nhưng có thể sử dụng hướng di chuyển hữu ích đúng hướng. Bất kỳ đề xuất?
[Chỉnh sửa]
tôi đã kết thúc đi với một sự kết hợp những gợi ý để xử lý tôi chuỗi-splitter. Nó có thể không phải là nhanh nhất, nhưng như là một newbie để LINQ, thực hiện này là gọn gàng nhất và dễ dàng cho tôi để hiểu.
public static List<string> SplitEvery(this string s, int size)
{
return s.Select((x, i) => i)
.Where(i => i % size == 0)
.Select(i => String.Concat(s.Skip(i).Take(size))).ToList();
}
Cảm ơn tất cả các đề xuất tuyệt vời.
Lưu ý phụ: sẽ rất hay khi chỉ định tiêu chí "tốt hơn" của bạn là gì. I E.trong trường hợp này nó có vẻ là "truy vấn có thể đọc được bởi người dùng LINQ mới làm quen với mô tả gần nhất có thể, thích phương pháp' Enumerable' hơn tất cả các cân nhắc về hiệu suất ". Trong 'Concat' lite lite này với 'Take' thực sự sẽ trông giống như một cách tiếp cận tốt nhất. –
Lời xin lỗi của tôi, đó là một đánh giá công bằng. Tôi đã chủ yếu quan tâm đến một cách tiếp cận sạch sẽ, một lớp lót tương tự như những nỗ lực ban đầu của tôi ở trên. Trong trường hợp của tôi, khả năng đọc quan trọng hơn đối với tôi hơn là khả năng mở rộng. Hy vọng rằng không ai sẽ cố gắng đổ một tập tin văn bản khổng lồ vào chuỗi của tôi. :) – MadHenchbot
(Nhận xét của tôi ở trên là đề xuất thuần túy - không có gì để xin lỗi). Một lưu ý ngẫu nhiên khác để xem ra trong LINQ - cách tiếp cận cuối cùng của bạn lặp lại chuỗi nhiều lần. Nó là tốt cho chuỗi, nhưng sẽ không làm việc cho "một thời gian" trình tự như kết quả của truy vấn SQL hoặc 'File.ReadAllLines'. Có một số câu trả lời (tức là với 'lợi nhuận') chứng minh các cách tiếp cận lặp lại việc thu thập một lần. –