2012-05-18 39 views
0

一個實施的atoi我有保存爲字符串的數字文件。我正在尋找加載這個數據作爲char []然後將此數組轉換爲整數值。我有幾個值來加載,我試圖避免產生數以千計的臨時字符串的開銷..是否有C#

回答

1

有幾種方式:

雖然,這些方法處理string對象,而不是char[]。在C#中,大多數情況下,您不像在C中那樣處理char[],因爲內置了string類型[MSDN]

+0

這些函數採用一個串不char [] –

+1

@AaronFischer:你爲什麼首先需要'char []'? –

+0

還有一個問題,即atoi()函數允許字符串「在形成整數的那些字符之後包含其他字符,這些字符被忽略,並且對此函數的行爲沒有影響。」 –

8

int.Parse(string) 

如果你絕對必須轉換字符串的字符數組(不知道爲什麼),你可以使用:

int.Parse(new string(myCharArray)); 

關於進一步筆記...

我尋找加載該數據作爲一個char [],那麼該數組轉換爲一個整數值。

是否有特別的理由使用char[]而不是僅僅從文件中讀取字符串?您將需要一個string要轉換爲int反正(使用標準轉換方法),因此它似乎死不瞑目。

我有幾個值來加載,我試圖避免產生數以千計的臨時字符串的開銷..

您應該只需要爲每次從文件中讀取字符串一個字符串。我不知道這裏涉及的是什麼其他處理,但是從文件中讀取一個字符串,然後轉換爲int不會產生不必要的臨時對象。

如果您正在執行大量/未知數量的字符串連接,那麼您應該使用StringBuilder來構建您的輸入,因爲它在封面下充當可變字符串(在創建時還將其初始化爲足夠大的尺寸) 。即便如此,它(應該)採取再從磁盤讀取數據,然後它會創建這些字符串。

+0

在.net中創建字符串需要花費,我試圖避免這種情況。 –

+1

而且它極其微乎其微。如果你真的需要,你總是可以構建一個[StringBuilder](http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx)並手動插入每個字符。 – Tejs

+5

@AaronFischer:創造一切都有成本。你有沒有進行過任何測量?你是否已經表明從文件中讀取字符串會引發應用程序中的瓶頸?爲什麼你認爲閱讀一個字符數組比閱讀一個字符串要便宜得多?在推出可能不必要和無效的優化之前,我會建議先採用簡單的路徑。 –

2

基本上

public static int StringToInt(char[] ch) 
     { 
      int length = ch.Length; 
      int i = 0; 
      int lastNumber = 0; 
      int returnNumber = 0; 
      bool numberNegative = false; 
      int startPoint = 0; 

      if (ch[ 0 ] == '-') 
      { 
       numberNegative = true; 
       startPoint = 1; 
      } 

      for (i = startPoint; i < length; i++) 
      { 
       if (ch[ i ] == ' ') 
       { 
        continue; 
       } 
       else 
       { 
        if ((ch[ i ] >= '0') && ch[ i ] <= '9') 
        { 
         returnNumber = ch[ i ] - '0'; 
         if (i > 0) 
          lastNumber = lastNumber * 10; 
         lastNumber = lastNumber + returnNumber; 
        } 
        else 
        { 
         break; 
        } 
       } 
      } 
      if (numberNegative) 
       lastNumber = -1 * lastNumber; 

      return lastNumber; 
     } 

其從http://www.csharptricks.com/blog/2006/09/string-to-integer-in-c-net.html與焦炭代替字符串[]

0

這裏也是可能的實現的atoi()的

int atoi(const char *s) 
{ 
    int n=0, neg=0; 
    while (isspace(*s)) s++; 
    switch (*s) { 
     case '-': neg=1; 
     case '+': s++; 
    } 
    /* Compute n as a negative number to avoid overflow on INT_MIN */ 
    while (isdigit(*s)) 
     n = 10*n - (*s++ - '0'); 
    return neg ? n : -n; 
}