Chuỗi không có ReplaceAt()
và tôi đang lúng túng một chút về cách tạo một chức năng phong nha làm những gì tôi cần. Tôi cho rằng chi phí CPU là cao, nhưng kích thước chuỗi nhỏ vì vậy tất cả okThay thế một char tại một chỉ mục đã cho trong chuỗi?
Trả lời
Sử dụng một StringBuilder
:
StringBuilder sb = new StringBuilder(theString);
sb[index] = newChar;
theString = sb.ToString();
ah, Stringbuilder gọn gàng – Jason94
@ Jason94, tôi không chắc điều này hiệu quả hơn việc sử dụng ToCharArray như trong câu trả lời của Jon, bạn nên chạy thử nghiệm để xem cái nào nhanh hơn. –
Tôi đã thử với một chút điểm chuẩn về các lần lặp 100k, ToCharArray nhanh hơn ít nhất 2 lần. –
string s = "ihj";
char[] array = s.ToCharArray();
array[1] = 'p';
s = new string(array);
Nhận xét theo câu trả lời được chấp nhận cho biết rằng cách tiếp cận này nhanh gấp hai lần. – Dejan
Các đơn giản nhất cách tiếp cận sẽ là một cái gì đó như:
public static string ReplaceAt(this string input, int index, char newChar)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
char[] chars = input.ToCharArray();
chars[index] = newChar;
return new string(chars);
}
này bây giờ là một phương pháp mở rộng, do đó bạn có thể sử dụng:
var foo = "hello".ReplaceAt(2, 'x');
Console.WriteLine(foo); // hexlo
Nó sẽ được tốt đẹp để nghĩ về một số cách mà chỉ cần một đơn bản sao của dữ liệu được thực hiện hơn là hai ở đây, nhưng tôi không chắc chắn về bất kỳ cách nào để làm điều đó. Đó là thể rằng điều này sẽ làm điều đó:
public static string ReplaceAt(this string input, int index, char newChar)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
StringBuilder builder = new StringBuilder(input);
builder[index] = newChar;
return builder.ToString();
}
... tôi nghi ngờ nó hoàn toàn phụ thuộc vào phiên bản của khuôn khổ bạn đang sử dụng.
+1 để biến nó thành một phương thức mở rộng. Như đã đề cập trong phần bình luận của câu trả lời được chấp nhận và cũng trong các câu trả lời khác, phương thức ToCharArray() nhanh hơn phương thức StringBuilder. Một cải tiến có thể có hơn: kiểm tra xem input.Count> index-1 && index> = 0 nếu không bạn sẽ nhận được một ngoại lệ khi bạn thực hiện chars [index] hoặc builder [index]. –
Strings là đối tượng bất biến, vì vậy bạn không thể thay thế một nhân vật được đưa ra trong chuỗi. Những gì bạn có thể làm là bạn có thể tạo một chuỗi mới với ký tự đã cho thay thế.
Nhưng nếu bạn là để tạo ra một chuỗi mới, tại sao không sử dụng một StringBuilder:
string s = "abc";
StringBuilder sb = new StringBuilder(s);
sb[1] = 'x';
string newS = sb.ToString();
//newS = "axc";
public string ReplaceChar(string sourceString, char newChar, int charIndex)
{
try
{
// if the sourceString exists
if (!String.IsNullOrEmpty(sourceString))
{
// verify the lenght is in range
if (charIndex < sourceString.Length)
{
// Get the oldChar
char oldChar = sourceString[charIndex];
// Replace out the char ***WARNING - THIS CODE IS WRONG - it replaces ALL occurrences of oldChar in string!!!***
sourceString.Replace(oldChar, newChar);
}
}
}
catch (Exception error)
{
// for debugging only
string err = error.ToString();
}
// return value
return sourceString;
}
sourceString.Replace (oldChar, newChar) thay thế tất cả các lần xuất hiện của oldChar trong chuỗi, không chỉ là ký tự tại charIndex. – EventHorizon
string err = error.ToString(); tại sao? –
tôi đột nhiên cần thiết để làm nhiệm vụ này và tìm thấy chủ đề này. Vì vậy, đây là của tôi biến LINQ-style:
public static class Extensions
{
public static string ReplaceAt(this string value, int index, char newchar)
{
if (value.Length <= index)
return value;
else
return string.Concat(value.Select((c, i) => i == index ? newchar : c));
}
}
và sau đó, ví dụ:
string instr = "Replace$dollar";
string outstr = instr.ReplaceAt(7, ' ');
Trong khi kết thúc tôi cần phải sử dụng Net Framework 2, vì vậy tôi sử dụng một biến thể StringBuilder
lớp Tuy nhiên.
Nó sẽ không được làm chậm, cho một chuỗi dài? Tại sao điều này, thay vì 'StringBuilder' hoặc' ToCharArray' giải pháp? Nó * có thể * là một bản sao ít hơn của chuỗi (so với 'StringBuilder'), nhưng tôi nghi ngờ rất nhiều xảy ra trong nội bộ. – ToolmakerSteve
Nếu dự án của bạn (csproj) cho phép mã không an toàn có lẽ đây là giải pháp nhanh hơn:
namespace System
{
public static class StringExt
{
public static unsafe void ReplaceAt(this string source, int index, char value)
{
if (source == null)
throw new ArgumentNullException("source");
if (index < 0 || index >= source.Length)
throw new IndexOutOfRangeException("invalid index value");
fixed (char* ptr = source)
{
ptr[index] = value;
}
}
}
}
Bạn có thể sử dụng nó như phương pháp mở rộng của Chuỗi đối tượng.
Tất nhiên, điều này vi phạm ngữ nghĩa của 'chuỗi' - ảnh hưởng đến bất kỳ tham chiếu nào khác đối tượng này, vô hiệu hóa/mâu thuẫn tài liệu mà các đối tượng' chuỗi' là * không thay đổi *. Làm như vậy, với một lớp được xây dựng trong, là rất đáng ngờ (mùi mã mạnh). Cần một chú thích WARNING khổng lồ tát vào nó. Cá nhân, tôi sẽ không ** làm điều này. Nếu ai đó cần một chuỗi * mutable *, sau đó tạo một lớp thích hợp, phân lớp hoặc gói một 'char []'. – ToolmakerSteve
- 1. Chèn một số chuỗi vào chuỗi đã cho tại chỉ mục đã cho trong Python
- 2. Tìm chỉ mục của một char trong chuỗi?
- 3. Thay thế nhiều char từ một chuỗi trong java
- 4. Lấy char từ chuỗi tại chỉ mục được chỉ định trong hình ảnh cơ bản
- 5. Thay thế một ký tự tại một chỉ mục nhất định trong NSString
- 6. Xóa char tại chỉ mục cụ thể - python
- 7. Thay thế một char thành NSString
- 8. Gán một chuỗi ký tự cho một mảng char
- 9. Cách lấy char từ chuỗi theo chỉ mục?
- 10. Thay đổi chuỗi char ở chỉ số X
- 11. Nối một chuỗi được lập chỉ mục chuỗi trong JavaScript
- 12. Làm thế nào để thay thế một chuỗi bằng một chuỗi khác trong haskell
- 13. tách chuỗi tại chỉ mục
- 14. Tại sao cardinality của một chỉ mục trong MySQL vẫn không thay đổi khi tôi thêm một chỉ mục mới?
- 15. Tìm chỉ mục trong một ArrayList có chứa một chuỗi
- 16. Đối với cột char/varchar/text, tại sao một chỉ mục cho cột đó giúp tìm kiếm nhanh hơn?
- 17. Trong Java, làm thế nào để biến một chuỗi thành một char hoặc char thành một String?
- 18. Làm thế nào để thay đổi 1 char trong chuỗi?
- 19. chuỗi Javascript - nhận được char tại một điểm nhất định
- 20. String.Replace (char, char) hoặc Replace (chuỗi, chuỗi)?
- 21. python - tìm char trong chuỗi - tôi có thể lấy tất cả các chỉ mục không?
- 22. Chỉ thay đổi UID/GID của một chuỗi trong Linux
- 23. Thay thế một số trong một chuỗi bằng jquery
- 24. C++, cách tốt nhất để thay đổi một chuỗi tại một chỉ số đặc biệt
- 25. Thay thế một ký tự của một chuỗi trong python
- 26. Java ArrayList thay thế tại chỉ mục cụ thể
- 27. Thay thế chỉ dụ đầu tiên của một chuỗi con trong một NSString
- 28. Thay thế ký tự cuối cùng trong một chuỗi
- 29. Tại sao putchar, toupper, tolower, vv lấy một int thay vì một char?
- 30. Nhận chỉ mục của không gian được phát hiện đầu tiên sau một chỉ mục nhất định trong chuỗi
Bạn không có nghĩa là 'không có' thay vì 'không có'? :) – Abbas