2011-08-05 47 views
10

Tôi cần một cách để chèn dấu phẩy sau mỗi ký tự trong một chuỗi. Vì vậy, ví dụ, nếu tôi có chuỗi các chữ cáiChèn dấu phẩy sau mỗi char trong C#

"ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

tôi cần phải làm cho nó để có một dấu phẩy sau mỗi lá thư từ A, đến Z, Tôi muốn giữ cho chuỗi như nó là và không chuyển đổi nó thành một mảng char hoặc một cái gì đó như thế. Tôi không biết nếu điều đó có thể nhưng nó chỉ là một cái gì đó id muốn tránh.

Tôi làm cách nào để thực hiện việc này? Kết quả cuối cùng phải được điều này:

"A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z," 

Cảm ơn

+0

bạn có thể tránh một mảng hoặc một StringBuilder hoặc một cái gì đó tương tự bởi vì chuỗi là chỉ đọc. Tại sao tránh sau đó họ là bạn! –

+0

có thể không được là –

Trả lời

21

Trong Net 4:

str = String.Join<char>(",", str) + ","; 

Net 4.0 cho biết thêm một tình trạng quá tải String.Join mà phải mất một IEnumerable<T>.
Mã này gọi là String được truyền tới IEnumerable<char>.

Tôi cần xác định rõ ràng thông số loại chung hoặc nó sẽ gọi quá tải params string[] (sử dụng một đơn string) thay thế.

14

Bạn phải làm một cái gì đó để tạo chuỗi mới. Phương pháp đơn giản nhất có lẽ sẽ là trong .NET 4:

// string.Join won't put the trailing comma 
string result = string.Join(",", (IEnumerable<char>) input) + ","; 

hoặc

string result = string.Join<char>(",", input) + ","; 

Hoặc trong .NET 3.5, nơi the overload we want không tồn tại:

// string.Join won't put the trailing comma 
string result = string.Join(",", input.Select(c => c.ToString()) 
             .ToArray()) + ","; 

Nếu những aren' đủ hiệu quả cho bạn, bạn luôn có thể thực hiện theo cách thủ công:

StringBuilder builder = new StringBuilder(input.Length * 2); 
foreach (char c in input) 
{ 
    builder.Append(c); 
    builder.Append(','); 
} 
string result = builder.ToString(); 
+1

+1, phương pháp cuối cùng (thủ công) thực hiện 10000000 lần trong 3727 ms trong khi 'String.Join (", ", str)' mất 10543 ms –

+0

+1 tình yêu dành cho người xây dựng chuỗi! – aevanko

1

Thay thế regex có thể hoạt động. Các regex có thể đơn giản như ([A-Z]), và làm một thay thế với trận đấu cộng với,. Tôi sẽ phải tra cứu làm thế nào để làm điều đó.

Xem tại đây, http://msdn.microsoft.com/en-us/library/xwewhkd1.aspx.

Dim input As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    Dim pattern As String = "([A-Z])" 
    Dim replacement As String = "$1," 
    Dim rgx As New Regex(pattern) 
    Dim result As String = rgx.Replace(input, replacement) 
2
string InsertCommasBetweenChars(string s) 
{ 
    return string.Join(",", s.ToCharArray()); 
} 

string.Join quá tải này chỉ tồn tại trong .NET 4.0; nếu bạn đang sử dụng một phiên bản trước, bạn có thể làm điều đó thay vì:

string InsertCommasBetweenChars(string s) 
{ 
    return string.Join(",", Array.ConvertAll(s.ToCharArray(), c => c.ToString())); 
} 
0

bạn có thể sử dụng một vòng lặp for và di chuyển char bởi char sau đó bạn có thể thêm các char hiện tại để một StringBuilder và thêm dấu phẩy là tốt.

sau khi vòng lặp hoàn tất, bạn trả về StringBuilder.ToString() hoặc gán nó cho biến chuỗi ban đầu nếu không cần giữ nguyên như trước đây.

0

này nên làm việc

var input = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
var result= String.Join(",", input.ToCharArray(0,input.Length)); 
0

Tôi biết bạn không muốn mảng char nhưng làm thế nào là điều này cho một sửa chữa ngắn:

Console.WriteLine(string.Join(",", "abc".ToCharArray())); 
0

Ở đây, lấy một số accumulator wisdom:

var result = "ABCDEFG".Aggregate("", (c, n) => c+ ("," + n)).Substring(1); 

Nó ít dễ đọc hơn. Nhưng linh hoạt hơn nhiều.

+0

'String.Concat (str.Select (c => c +", "))' là nhanh hơn nhiều. Ông _wants_ dấu phẩy. – SLaks

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