2011-06-24 75 views
0

我需要逐個字符地讀取一個字符串,然後構建一個新的字符串作爲輸出。C#/。NET:重新格式化一個很長的字符串

在C#中這樣做的最佳方法是什麼?

使用StringBuilder?使用一些作家/流?

請注意,將不會有I/O操作 - 這嚴格是內存轉換。

+3

什麼是你真正想實現的,一個例子會有幫助 – ChrisBint

+0

你事先知道你的重新格式化字符串的大小嗎?如果是這樣,如果重新格式化的字符串大小,應該能夠創建一個'char []',將每個字符放入它,然後使用'new String(charBuffer)'將其轉換回字符串。 – Juliet

回答

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)); 
} 
0

Stringbuilder通常是一個不錯的選擇。我在使用它的網頁上寫了很多javascript。

2

如果它只是一個字符串,你可以使用一個集合來保存你的人物,然後就使用構造函數創建的字符串:

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的字符串),但在我看來更具可讀性。

0

A StringBuilder是構建新字符串的好主意,因爲您可以高效地向其添加新值。至於讀取輸入字符串中的字符,StringReader將是一個充足的選擇。

-1

讀取字符串和輸出字符串有什麼區別?我的意思是爲什麼你必須閱讀字符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? 
} 
+0

而這將是最糟糕的做法。您可能會在循環中創建*一噸*副本,並且OP會特別提到該字符串會很大。 –

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 != ';'; 
}