在 StringBuilder 中替换字符串之前是否需要检查(使用“Contains”或“IndexOf”等函数)?

发布于 2024-11-16 16:22:17 字数 398 浏览 1 评论 0原文

C# 中有 IndexOf 或 Contains 方法吗?下面是代码:

var sb = new StringBuilder(mystring);
sb.Replace("abc", "a");
string dateFormatString = sb.ToString();

if (sb.ToString().Contains("def"))
{
    sb.Replace("def", "aa");
}


if (sb.ToString().Contains("ghi"))
{
    sb.Replace("ghi", "assd");
}

正如您可能已经注意到的那样,我一次又一次地使用上面的 ToString() ,我想避免这种情况,因为它每次都会创建新的字符串。你能帮我看看我该如何避免吗?

Is there any method IndexOf or Contains in C#. Below is the code:

var sb = new StringBuilder(mystring);
sb.Replace("abc", "a");
string dateFormatString = sb.ToString();

if (sb.ToString().Contains("def"))
{
    sb.Replace("def", "aa");
}


if (sb.ToString().Contains("ghi"))
{
    sb.Replace("ghi", "assd");
}

As you might have noticed I am using ToString() above again and again which I want to avoid as it is creating new string everytime. Can you help me how can I avoid it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

追风人 2024-11-23 16:22:17

如果 StringBuilder 包含“def”,那么执行替换不会导致任何问题,因此只需使用:

var sb = new StringBuilder(mystring);
sb.Replace("abc", "a");
sb.Replace("def", "aa");
sb.Replace("ghi", "assd");

If the StringBuilder doesn't contain "def" then performing the replacement won't cause any problems, so just use:

var sb = new StringBuilder(mystring);
sb.Replace("abc", "a");
sb.Replace("def", "aa");
sb.Replace("ghi", "assd");
嘦怹 2024-11-23 16:22:17

StringBuilder 中没有这样的方法,但您不需要 Contains 测试。您可以简单地这样写:

 sb.Replace("abc", "a");
 sb.Replace("def", "aa");
 sb.Replace("ghi", "assd");

如果没有找到 Replace 的第一个参数中的字符串,那么对 Replace 的调用就是一个空操作——正是您想要的。

文档指出:

用另一个指定字符串替换此实例中所有出现的指定字符串。

你读这篇文章的方式是,当没有发生任何事情时,就什么也不做。

There's no such method in StringBuilder but you don't need the Contains tests. You can simply write it like this:

 sb.Replace("abc", "a");
 sb.Replace("def", "aa");
 sb.Replace("ghi", "assd");

If the string in the first parameter to Replace is not found then the call to Replace is a null operation—exactly what you want.

The documentation states:

Replaces all occurrences of a specified string in this instance with another specified string.

The way you read this is that when there are no occurrences, nothing is done.

↙厌世 2024-11-23 16:22:17

恕我直言,在这种情况下,您不必使用 StringBuilder...在循环中使用 StringBuilder 时更有用。就像微软在这篇文章中所说的那样

String 对象是不可变的。每一个
当你使用其中一种方法时
System.String类,你新建一个
内存中的字符串对象,其中
需要重新分配空间
那个新对象。在以下情况下
你需要重复执行
对字符串的修改,
与创建相关的开销
new String 对象的成本可能很高。这
System.Text.StringBuilder类可以是
当你想修改字符串时使用
无需创建新对象。为了
例如,使用 StringBuilder 类
可以提高性能
将许多字符串连接在一起
一个循环

所以简单地你可以使用 String 并避免使用 ToString()...

IMHO you don't have to use StringBuilder in this case... StringBuilder is more useful when used in a loop. Like Microsoft say in In this article

The String object is immutable. Every
time you use one of the methods in the
System.String class, you create a new
string object in memory, which
requires a new allocation of space for
that new object. In situations where
you need to perform repeated
modifications to a string, the
overhead associated with creating a
new String object can be costly. The
System.Text.StringBuilder class can be
used when you want to modify a string
without creating a new object. For
example, using the StringBuilder class
can boost performance when
concatenating many strings together in
a loop

So simply you can use String and avoid use ToString()...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文