【问题标题】:Most efficient way of adding/removing a character to beginning of string?在字符串开头添加/删除字符的最有效方法?
【发布时间】:2014-09-30 10:56:20
【问题描述】:

我正在做一个小型的“可扩展”C# MVC 项目,对数据库进行相当多的读/写操作。

由此,我需要添加/删除输入字符串的第一个字母。


'Removing' 第一个字符很容易(使用 Substring 方法) - 使用类似:

String test = "HHello world";
test = test.Substring(1,test.Length-1);

'Adding' 一个有效的角色似乎是混乱/尴尬:

String test = "ello World";
test = "H" + test;

鉴于这将对很多记录进行,这是执行这些操作的最有效方式吗?

我也在测试一个字符串是否以字母'T'开头,如果不是,则添加'T':

String test = "Hello World";
if(test[0]!='T')
{
    test = "T" + test;
}

想知道这是否适合这个

【问题讨论】:

  • 您是否必须将一个字符附加到多个不同的记录或同一个字符串?
  • 你可以使用StringBuilder
  • 如果是小项目可以省略完美效率的考虑。
  • Stringbuilder 用于字符串操作的效率越高,它用于给定字符串的次数越多,即超过 10,000 次,并且比使用您的方法效率更高。
  • 这取决于字段的第一个字符是什么,因此可能会应用也可能不会应用。 @Anton,目前这个项目很小,但随着时间的推移会有很大的表(由于表的性质)

标签: c# string performance concatenation


【解决方案1】:

我认为两者都同样有效,因为两者都需要初始化一个新的 string,因为 string 是不可变的。

在同一字符串上多次执行此操作时,添加时StringBuilder 可能会派上用场。与添加相比,这将提高性能。

如果可能,您还可以选择将此操作移至数据库端。这也可能会提高性能。

【讨论】:

  • 它将是多个字符串(它会从 db 中读取可能的 T - 我想删除它,doStuff(),用 T 插入新记录(在检查它们是否也有 T 之后)。所以如果有的话,特定的字符串只会被编辑一次。stringbuilder 仍然是前进的方向吗?
  • 这取决于string 上的操作数。我不确定StringBuilder 超过string 的意义何在。像这样的简单操作在数据库中效率更高。
  • 0-2 次?因此将其保留为 String 而不是 StringBuilder(抱歉,我不知道如何在 cmets 中添加代码块)
  • 我认为范围要高得多,因为它涉及在内存中创建实际的StringBuilder、堆栈操作等。还取决于字符串的长度。我通常在知道中等长度字符串的操作数超过 10-20 时开始。
【解决方案2】:

如果您有多个记录,并且需要在每个记录字段的开头附加一个字符,则可以使用索引为 0 的String.Insert http://msdn.microsoft.com/it-it/library/system.string.insert(v=vs.110).aspx

string yourString = yourString.Insert( 0, "C" );

这与您在原始帖子中所写的内容几乎相同,但由于您似乎更喜欢使用方法而不是运算符...

如果您必须将一个字符多次附加到单个字符串,那么您最好使用 StringBuilder http://msdn.microsoft.com/it-it/library/system.text.stringbuilder(v=vs.110).aspx

【讨论】:

  • 我更喜欢运算符而不是方法,只是并非所有输入字符串都需要编辑(与我的拼写不同,似乎:P),所以我使用方法。
【解决方案3】:

对于删除我会使用删除命令,因为这不需要知道字符串的长度:

test = test.Remove(0, 1);

你也可以把字符串当作数组来添加和使用

test = test.Insert(0, "H");

如果您总是删除然后添加一个字符,您可以再次将字符串视为一个数组并替换该字符。

test = (test.ToCharArray()[0] = 'H').ToString();

当对同一个字符串进行大量操作时,我会使用 StringBuilder,虽然创建成本更高,但对字符串的操作更快。

【讨论】:

  • 字符串是不可变的,不能这样做test[0] = "H"
  • 啊,是的,我忘记了,使用 ToCharArray() 方法仍然可以将其视为 char 数组,虽然有点贵str = (str.ToCharArray()[0] = 'H').ToString();
  • 这意味着您正在创建一个额外的字符数组。这样不会更有效率。
  • ToCharArray 使用不安全的代码和指针,所以我相信它的开销只是复制小字符串的字符串。这取决于您对字符串执行了多少操作,因为它可以更容易使用,但是我同意单个操作是不值得的。
猜你喜欢
  • 2010-11-10
  • 2015-08-16
  • 2015-11-11
  • 2015-01-28
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多