我需要逐個字符地讀取一個字符串,然後構建一個新的字符串作爲輸出。C#/。NET:重新格式化一個很長的字符串
在C#中這樣做的最佳方法是什麼?
使用StringBuilder?使用一些作家/流?
請注意,將不會有I/O操作 - 這嚴格是內存轉換。
我需要逐個字符地讀取一個字符串,然後構建一個新的字符串作爲輸出。C#/。NET:重新格式化一個很長的字符串
在C#中這樣做的最佳方法是什麼?
使用StringBuilder?使用一些作家/流?
請注意,將不會有I/O操作 - 這嚴格是內存轉換。
如果在編譯時無法確定字符串的大小,並且它也可能相對較大,則應使用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));
}
Stringbuilder通常是一個不錯的選擇。我在使用它的網頁上寫了很多javascript。
如果它只是一個字符串,你可以使用一個集合來保存你的人物,然後就使用構造函數創建的字符串:
IEnumerable<char> myChars = ...;
string result = new string(myChars);
使用LINQ和一個方法ProcessChar(char c)
的幫助,將每個字符它的輸出值,這可能只是一個查詢變換(使用字符串構造函數的IEnumerable<char>
作爲輸入):
string result = new string(sourceString.Select(c => ProcessChar(c)));
這是作爲使用StringBuilder
作爲有效(因爲StringBuilder
在字符串類內部用於構造來自IEnumerable
的字符串),但在我看來更具可讀性。
A StringBuilder
是構建新字符串的好主意,因爲您可以高效地向其添加新值。至於讀取輸入字符串中的字符,StringReader
將是一個充足的選擇。
讀取字符串和輸出字符串有什麼區別?我的意思是爲什麼你必須閱讀字符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?
}
而這將是最糟糕的做法。您可能會在循環中創建*一噸*副本,並且OP會特別提到該字符串會很大。 –
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 != ';';
}
什麼是你真正想實現的,一個例子會有幫助 – ChrisBint
你事先知道你的重新格式化字符串的大小嗎?如果是這樣,如果重新格式化的字符串大小,應該能夠創建一個'char []',將每個字符放入它,然後使用'new String(charBuffer)'將其轉換回字符串。 – Juliet