我需要逐个字符地读取字符串,并构建一个新字符串作为输出。
在C#中执行此操作的最佳方法是什么?
使用StringBuilder?使用一些writer / stream?
请注意,不会有I / O操作 - 这严格来说就是内存中的转换。
答案 0 :(得分:5)
如果在编译时无法确定字符串的大小并且它也可能相对较大,则应使用StringBuilder
进行连接,因为它的作用类似于可变字符串。
var input = SomeLongString;
// may as well initialize the capacity as well
// as the length will be 1 to 1 with the unprocessed input.
var sb = new StringBuilder( input.Length );
foreach( char c in input )
{
sb.Append( Process( c ) );
}
答案 1 :(得分:2)
如果它只是一个字符串,你可以使用一个集合来保存你的字符,然后使用构造函数创建字符串:
IEnumerable<char> myChars = ...;
string result = new string(myChars);
使用Linq并在方法ProcessChar(char c)
的帮助下将每个字符转换为其输出值,这可能只是一个查询转换(使用以IEnumerable<char>
作为输入的字符串构造函数):< / p>
string result = new string(sourceString.Select(c => ProcessChar(c)));
这与使用StringBuilder
一样有效(因为StringBuilder
在字符串类内部用于构造IEnumerable
)的字符串,但在我看来更具可读性。
答案 2 :(得分:0)
Stringbuilder通常是一个不错的选择。我在网页上写了很多javascript使用它。
答案 3 :(得分:0)
StringBuilder
是构建新字符串的好主意,因为您可以有效地为其添加新值。至于从输入字符串中读取字符,StringReader
就足够了。
答案 4 :(得分:0)
void Main()
{
string myLongString = "lf;kajsd;lfkjal;dfkja;lkdfja;lkdjf;alkjdfa";
var transformedTString = string.Join(string.Empty, myLongString.ToCharArray().Where(x => x != ';'));
transformedTString.Dump();
}
如果你有更复杂的逻辑,你可以将验证移到单独的谓词方法
void Main()
{
string myLongString = "lf;kajsd;lfkjal;dfkja;lkdfja;lkdjf;alkjdfa";
var transformedTString = string.Join(string.Empty, myLongString.ToCharArray().Where(MyPredicate));
transformedTString.Dump();
}
public bool MyPredicate(char c)
{
return c != ';';
}
答案 5 :(得分:-1)
读取字符串和输出字符串之间有什么区别?我的意思是你为什么要用char读取char?
我使用此方法读取字符串
string str = "some stuff";
string newStr = ToNewString(str);
string ToNewString(string arg)
{
string r = string.Empty;
foreach (char c in arg)
r += DoWork(c);
return r;
}
char DoWorK(char arg)
{
// What do you want to do here?
}