2011-12-12 17 views
6

Cách phân tích chuỗi [] thành chuỗi có dấu cách ở giữa Bạn sẽ cấu trúc lại mã này bằng cách nào?Cách kết hợp chuỗi [] thành chuỗi có dấu cách ở giữa

internal string ConvertStringArrayToString(string[] array) 
    { 
     StringBuilder builder = new StringBuilder(); 
     builder.Append(array[0]); 
     for (int i = 1; i < array.Length; i++) 
     { 
      builder.Append(' '); 
      builder.Append(array[i]); 
     } 
     return builder.ToString(); 
    } 
+3

Đây không phải là Phân tích cú pháp mà là một dạng Kết hợp. –

Trả lời

22

Có một phương pháp cho rằng đã:

String.Join(" ", array) 

này sẽ đặt một khoảng cách giữa mỗi phần tử. Lưu ý rằng nếu bất kỳ của các yếu tố của bạn là chuỗi rỗng, bạn sẽ kết thúc với không gian tiếp giáp với nhau, vì vậy bạn có thể muốn lọc những trước thời hạn, như thế này:

String.Join(" ", array.Where(s => !String.IsNullOrEmpty(s))) 
+3

"Có vẻ như quá mức cần thiết ..." - điều đó không phụ thuộc vào cách đơn giản như thế này nhưng tần suất sử dụng. Nếu đó là một đơn vị logic bạn muốn có một định nghĩa duy nhất. –

+1

@ HenkHolterman: Có, bạn nói đúng, có thể có một lý do để đưa mã tầm thường vào một phương pháp chỉ để đặt tên trên đó. – Guffa

+0

Chỉ cần một lưu ý phụ, nếu một mục trong mảng trống, bạn sẽ kết thúc với hai dấu cách. Đôi khi mong muốn, đôi khi không. 'String.Join (" ", array.Where (s =>! String.IsNullOrEmpty (s)))' sẽ loại bỏ các khoảng trống thừa giữa các mục mảng của bạn. –

0

Sử dụng LINQ Aggregate() phương pháp:

string result = array.Aggregate((acc, next) => acc + " " + next); 
+3

Tôi tò mò như thế nào điều này sẽ thực hiện so với bản gốc, vì nó xuất hiện để phân bổ một tải đối tượng chuỗi hơn khi nó xử lý. –

+0

Phải, LINQ không miễn phí. Tôi tin rằng trong trường hợp cụ thể này String.Join sẽ là một giải pháp tuyệt vời, BTW tôi đã không thể nhìn thấy String.Join thực hiện phản xạ usign, nó sẽ br khá thú vị để xem làm thế nào nó sẽ tham gia kể từ khi chuỗi là bất biến, vì vậy có lẽ tổng hợp sẽ thực hiện trong tương đối cùng một thời gian/bộ nhớ phức tạp? – sll

+0

Việc triển khai 'String.Join' rất có thể tìm ra kích thước của chuỗi cuối cùng bằng cách thêm chiều dài của chuỗi trong mảng và dấu phân tách, cấp phát một bộ đệm chuỗi, sao chép chuỗi và trả về bộ đệm chuỗi dưới dạng chuỗi. Giải pháp 'Aggregate' thực sự hoạt động khá kém khi so sánh, vì nó sẽ sao chép cùng một dữ liệu nhiều lần. Với mỗi mục mảng bổ sung, thời gian thực hiện khoảng gấp đôi, vì vậy nếu bạn có một mảng dài nó sẽ nhận được rất chậm. – Guffa

2
internal string ConvertStringArrayToString(string[] array) 
{ 
    return string.Join(" ", array); 
} 

Tất nhiên, thật ngớ ngẩn khi có phương pháp chỉ gọi một phương thức khác, vì vậy bạn có thể đi toàn bộ và loại bỏ hoàn toàn phương pháp của bạn ...

+0

Tôi đồng ý với tuyên bố của bạn cho tình huống này, nhưng không đồng ý với tuyên bố về chăn "thật ngớ ngẩn khi có phương thức chỉ gọi một phương thức khác'. Phương thức chuyển tiếp rất hữu ích khi tuân theo Luật Demeter, cũng như khi sản xuất trình bao bọc xung quanh API của bên thứ ba, vì bất kỳ thay đổi đột phá nào cũng có thể bị bắt và xử lý ở một nơi. – Lukazoid

+0

@Lukazoid Đồng ý rằng nó có thể hữu ích khi giao dịch với API của bên thứ ba hoặc cũng có thể khi bạn muốn thêm điều kiện trước vào phương thức này và hơn thế nữa. –

Các vấn đề liên quan