2011-11-02 30 views
1

我有一個包含圖形數據是這樣的一個字符串..有效的方式從列表中<string>在C#中提取雙值

string sGraph = "0.05 /m 0.05 /m 0.05 /m 0.05 /m 0.05 /m 0.05 /m 0.05 /m 0.05....... 0.05 /m"; 

我有一個雙[]或成以提取雙值進一步處理的列表。例如。我使用

List<String> sGraphPoints = Regex.Split(sGraph, " /m").ToList<string>(); 

檢索字符串列表中的double值。然後,我可以使用字符串列表中的每個值進行進一步處理。有沒有一種有效的方法,我可以這樣做,而不是鑄造每個字符串變量值成雙,如下圖所示...

double[] dGraphPoints = new double[sGraphPoints.Count]; 
      int i = 0; 
      foreach (string str in sGraphPoints) 
      { 
       if (str != "") 
       { 
        dGraphPoints[i] = double.Parse(str); 
       } 
       else 
       { 
        dGraphPoints[i] = 0.0; 
       } 

       i++; 
      } 

提前感謝

+1

取決於,你認爲他們是雙打還是不是?如果你這樣做,那麼你必須自然地轉換字符串。另外,當你可以簡單地使用'string.Split'時,正則表達式是不必要的。 –

+1

爲什麼你需要一個有效的方法。除非你使用巨大的列表,否則這應該會很快。一個有效的方法是讀取字符串,直到找到/ m並在/ m之前轉換爲數據爲止,然後再讀取下一個塊,直到您再次找到/ m爲止。 – CodingBarfield

+0

他確實應該使用TryParse,因爲Parse(str)如果該字符串不是數字,則會拋出一個異常,以及大量的數字等。 –

回答

4
double[] dGraphPoints = sGraph.Split("/m") 
           .Select(s => s.Trim()) 
           .Where(s => !string.IsNullOrEmpty(s)) 
           .Select(s => Double.Parse(s)) 
           .ToArray() 

這僅略多'高效',因爲它不使用正則表達式,也不會在兩者之間創建額外的列表。

但真的,這涉及到你使用的值是什麼?您可能可以修改where子句以僅選擇您感興趣的值,但我不知道這些值是什麼。

+2

與現有解決方案相比,這是否成爲「高效」? –

+0

@ Mr.Disappointment是的,我接受你的觀點。它至少更短:) – Ray

+0

是的,我同意@Ray上述方法更短,更具可讀性。 –

0

就是這樣;

public static IList<double> Parse(string text) 
{ 
    List<double> list = new List<double>(); 
    if (text != null) 
    { 
     StringBuilder dbl = new StringBuilder(30); 
     for (int i = 0; i < text.Length; i++) 
     { 
      if (text[i] == 'm') 
      { 
       list.Add(double.Parse(dbl.ToString(), CultureInfo.InvariantCulture)); 
       dbl.Length = 0; 
      } 
      else 
      { 
       if ((text[i] != ' ') && (text[i] != '/')) 
       { 
        dbl.Append(text[i]); 
       } 
      } 
     } 
    } 
    return list; 
} 

它不使用正則表達式,只分配需要的數組和一個固定大小的StringBuilder。如果文本是作爲TextReader而不是字符串提供的,則可以將返回的IList更改爲IEnumerable,使用yield而不是Add來優化內存消耗。