2011-08-07 20 views
2

要構建稀疏填充的固定寬度記錄,我想從給定位置開始將字符串字段複製到StringBuilder對象中。一個漂亮的語法這將是在C#中,執行「靜態」複製到StringBuilder對象的子字符串中

StringBuilder sb = new StringBuilder(' ', 100); 
string fieldValue = "12345"; 
int startPos = 16; 
int endPos = startPos + fieldValue.Length - 1; 
sb[startPos..endPos] = fieldValue; // no such syntax 

我能明顯這樣做C形式,一個字符時間:

for (int ii = 0; ii++; ii < fieldValue.Length) 
    sb[startPos + ii] = fieldValue[ii]; 

但這似乎這樣的C#太麻煩了,再加上它使用一個循環其中最終的機器代碼可以更有效地使用批量複製,如果涉及的字符串很長,這可能會有所不同。任何想法更好的方法?

回答

1

您可以編寫自己的專門的字符串生成器類,它使用的char[]string下的高效機器支持引擎蓋,特別是String.CopyTo

public class FixedStringBuilder 
{ 
    char[] buffer; 

    public FixedStringBuilder(int length) 
    { 
     buffer = new string(' ', length).ToCharArray(); 
    } 

    public FixedStringBuilder Replace(int index, string value) 
    { 
     value.CopyTo(0, buffer, index, value.Length); 
     return this; 
    } 

    public override string ToString() 
    { 
     return new string(buffer); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     FixedStringBuilder sb = new FixedStringBuilder(100); 
     string fieldValue = "12345"; 
     int startPos = 16; 
     sb.Replace(startPos, fieldValue); 
     string buffer = sb.ToString(); 
    } 
} 
+0

謝謝 - 這正是我正在尋找。我永遠不會想到它作爲一個不可變System.String的方法:)謝謝! –

0

最接近您的目標的解決方案是轉換char數組中的源字符串,然後替換單元格。任何字符數組都可以轉換回字符串。

0

你爲什麼要預先在字符串生成器中分配內存(它只支持性能)。

我會追加已知的前綴,然後將實際值和後綴添加到字符串。

類似:

StringBuilder sb = new StringBuilder(); 
sb.Append(prefix).Append(value).Append(postfix); 
+0

這並沒有解決「尋找」的情況,你有一個已知固定長度的靜態字符序列,並且你想在一個給定的「地址」上覆蓋它的一小塊區域。 –

2

你原來的算法可以通過以下方式

var builder = new StringBuilder(new string(' ', 100)); 
string toInsert = "HELLO WORLD"; 
int atIndex = 10; 
builder.Remove(atIndex, toInsert.Length); 
builder.Insert(atIndex, toInsert); 

Debug.Assert(builder.Length == 100); 
Debug.Assert(builder.ToString().IndexOf(toInsert) == 10); 
+3

由於尾部來回移動,它可能比逐字符替換更慢。我不會建議,而不是一個簡單的循環。 –

+0

對於像這樣的單一算法操作,我只是使用一個字符串,並且完全忘記了這個構建器,這太過分了。對於我會多次執行的事情,比如說,在一個循環中,當然我會想要效率,但也有一些很容易推理的東西。陣列中的char替換操作在合理性測試儀上的排名會較低,因此推測的性能增益將需要值得。 –

+0

這很大程度上取決於場景。例如,如果您閱讀大文件並在開頭替換了幾個地方 - 這會造成很大的性能損失。爲了可讀性'for'和'Remote' /'Insert'變體在這裏幾乎是相等的。所以這是由OP基本上:) –