簡體   English   中英

從List中提取double值的有效方法 <string> 在C#中

[英]Efficient way to extract double value from a List<string> in 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";

我必須在double []或List中提取double值以進行進一步處理。 對於前者 我用

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

檢索字符串列表中的double值。 然后,我可以使用字符串列表中的每個值進行進一步處理。 有沒有一種有效的方法,我可以做同樣的,而不是將每個字符串變量值轉換為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++;
            }

提前謝謝了

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

這只是稍微“有效”,因為它沒有使用正則表達式而且它之間沒有創建額外的列表。

但實際上,它取決於你使用的是什么價值? 您可以修改where子句以僅選擇您感興趣的值,但我不知道它們會是什么。

像這樣的東西;

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

它不使用Regex,只分配所需的數組和固定大小的StringBuilder。 如果文本是作為TextReader而不是字符串提供的,則可以將返回的IList更改為IEnumerable,使用yield而不是Add,並優化內存消耗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM