2012-01-24 70 views
31

tôi có mã này:Làm thế nào để thay đổi 1 char trong chuỗi?

string str = "valta is the best place in the World"; 

tôi cần phải thay thế các biểu tượng đầu tiên. Khi tôi thử điều này:

str[0] = 'M'; 

Tôi đã gặp lỗi. Tôi có thể làm cái này như thế nào?

+3

Bạn đang gặp phải lỗi gì? – Oded

+1

Bất cứ lỗi nào anh ta nhận được là một lỗi tốt. Các chuỗi là các đối tượng bất biến, bình thường cho trình biên dịch phàn nàn về lệnh đó ... –

+0

@Oded - có một số lý do khiến việc này không hoạt động. Chuỗi là bất biến trong .NET, không giống như, ví dụ, Delphi, nơi nó sẽ hoạt động. Bạn không thể thay đổi ký tự chuỗi theo chỉ mục như thế này. C# cũng không có chuyển đổi ngầm từ chuỗi thành char - 'M' sẽ phải được khai báo là {char c = 'M'}. –

Trả lời

37

Chuỗi không thay đổi, nghĩa là bạn không thể thay đổi ký tự. Thay vào đó, bạn tạo chuỗi mới.

Những gì bạn đang yêu cầu có thể được thực hiện theo nhiều cách. Giải pháp thích hợp nhất sẽ khác nhau tùy thuộc vào bản chất của những thay đổi bạn đang thực hiện đối với chuỗi gốc. Bạn chỉ thay đổi một nhân vật? Bạn có cần chèn/xóa/nối thêm không?

Dưới đây là một vài cách để tạo ra một chuỗi mới từ một chuỗi hiện có, nhưng có một ký tự đầu tiên khác nhau:

str = 'M' + str.Remove(0, 1); 

str = 'M' + str.Substring(1); 

Ở trên, chuỗi mới được gán cho các biến ban đầu, str.

Tôi muốn thêm rằng câu trả lời từ những người khác thể hiện StringBuilder cũng rất phù hợp. Tôi sẽ không khởi tạo StringBuilder để thay đổi một ký tự, nhưng nếu cần nhiều thay đổi, thì StringBuilder là giải pháp tốt hơn các ví dụ tạo chuỗi tạm thời mới trong quy trình. StringBuilder cung cấp một đối tượng có thể thay đổi cho phép nhiều thay đổi và/hoặc chắp thêm hoạt động. Khi bạn đã thực hiện xong các thay đổi, một chuỗi bất biến được tạo từ StringBuilder bằng phương pháp .ToString(). Bạn có thể tiếp tục thực hiện thay đổi đối tượng StringBuilder và tạo thêm chuỗi mới, nếu cần, sử dụng .ToString().

31

Tôi khuyên bạn nên sử dụng StringBuilder lớp học cho nó và phân tích cú pháp thành chuỗi nếu bạn cần.

System.Text.StringBuilder strBuilder = new System.Text.StringBuilder("valta is the best place in the World"); 
strBuilder[0] = 'M'; 
string str=strBuilder.ToString(); 

Bạn không thể thay đổi các ký tự của chuỗi theo cách này, bởi vì trong chuỗi C# không động và không thay đổi và ký tự chỉ đọc. Để chắc chắn trong nó cố gắng sử dụng các phương pháp của chuỗi, ví dụ, nếu bạn làm str.ToLower() nó làm cho chuỗi mới và chuỗi trước của bạn không thay đổi.

5
str = "M" + str.Substring(1); 

Nếu bạn sẽ làm một số thay đổi như sử dụng một StringBuilder hay char[].

(Ngưỡng khi StringBuilder trở nên nhanh hơn là sau khoảng 5 concatenations hoặc chuỗi con, nhưng lưu ý rằng nhóm concatenations của a + "b" + c + d + "e" + f được thực hiện trong một cuộc gọi duy nhất và biên dịch kiểu concatenations của "a" + "b" + "c" không yêu cầu một cuộc gọi nào cả).

Nó có vẻ rằng cần phải làm điều này là khủng khiếp không hiệu quả, nhưng thực tế là chuỗi không thể thay đổi cho phép rất nhiều lợi nhuận hiệu quả và lợi thế khác như nêu tại Why .NET String is immutable?

13

Strings là không thay đổi. Bạn có thể sử dụng lớp trình tạo chuỗi để trợ giúp !:

string str = "valta is the best place in the World"; 

StringBuilder strB = new StringBuilder(str); 

strB[0] = 'M'; 
+0

@Bobbity Bob, bạn có thể cụ thể hơn một chút tại sao điều này không chính xác? Tất cả tôi nghĩ là tôi đã không được giao trở lại một chuỗi từ xây dựng chuỗi (bằng cách sử dụng phương pháp ToString của nó) – Jeb

+0

Tôi không có ý tưởng những gì tôi có nghĩa là do đó. tôi chỉ chạy mã và nó hoạt động. nếu bạn chỉnh sửa câu trả lời của bạn (như chèn một không gian ở đâu đó) tôi cũng sẽ upvote nó quá .. có vẻ tốt ... –

+0

@ Bob Bobity Không lo lắng - cảm ơn! – Jeb

6

tôi đã thực hiện một phương pháp để làm điều này

string test = "Paul"; 
    test = ReplaceAtIndex(0, 'M', test); 

    (...) 

    static string ReplaceAtIndex(int i, char value, string word) 
    { 
     char[] letters = word.ToCharArray(); 
     letters[i] = value; 
     return string.Join("", letters); 
    } 
+3

Bạn nên làm một phương pháp mở rộng. – Otiel

+0

sẽ là tuyệt vời! –

+0

giải pháp tốt nhất vì nó có thể được sử dụng trong các trường hợp khác với ký tự đầu tiên. Các câu trả lời khác dường như bị hạn chế. – gunwin

5

Merged câu trả lời Chuck Norris của w/Paulo Mendonça bằng cách sử dụng phần mở rộng phương pháp:

/// <summary> 
/// Replace a string char at index with another char 
/// </summary> 
/// <param name="text">string to be replaced</param> 
/// <param name="index">position of the char to be replaced</param> 
/// <param name="c">replacement char</param> 
public static string ReplaceAtIndex(this string text, int index, char c) 
{ 
    var stringBuilder = new StringBuilder(text); 
    stringBuilder[index] = c; 
    return stringBuilder.ToString(); 
} 
6

Trong khi nó không trả lời câu hỏi của OP chính xác, tùy thuộc vào những gì bạn đang làm nó có thể là một giải pháp tốt. Dưới đây là sẽ giải quyết vấn đề của tôi.

Giả sử bạn phải thực hiện rất nhiều thao tác cá nhân của các ký tự khác nhau trong một chuỗi. Thay vì sử dụng một chuỗi toàn bộ thời gian sử dụng một mảng char[] trong khi bạn đang thực hiện thao tác. Bởi vì bạn có thể làm điều này:

char[] array = "valta is the best place in the World".ToCharArray(); 

Sau đó thao tác nội dung trái tim của bạn càng nhiều càng tốt bạn cần ...

array[0] = "M"; 

Sau đó chuyển đổi nó thành một chuỗi một khi bạn đã hoàn tất và cần phải sử dụng nó dưới dạng một chuỗi:

string str = new string(array); 
+0

Nhưng không phải là 'StringBuilder' một sự lựa chọn tốt hơn so với' char [] '? 'StringBuilder' có các phương thức để chắp thêm, chèn, xóa và định dạng, trong khi' char [] 'sẽ giữ nguyên chiều dài cố định. Tôi cho rằng nếu tôi đang xử lý một chuỗi dài cố định chỉ với các thao tác ký tự đơn thì tôi có thể chọn 'char []'. –

+0

Trường hợp của tôi là một chuỗi có độ dài cố định. Vì vậy, trong trường hợp của tôi, tôi thực sự chỉ muốn cách nhanh nhất để thay thế một nhân vật. Tôi đã không gõ các phương pháp khác. Chỉ cần chia sẻ một phương pháp hợp lệ làm việc cho tôi. – badweasel

+0

Âm thanh tốt. Chúc mừng! –

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