簡體   English   中英

如何在同一個 position 中將多個字符串 Arrays 中的雙精度值相加? C#

[英]How do I add up Double Values from multiple String Arrays at the same position? C#

我從我的數據庫中得到這樣的字符串:

NaN#Nan#44.20216139610997#45.35340149990988#45.44329482112824#45.1593428796393#NaN#NaN

values = SQLvalues.Split('#'); //produces Array you can see in the picture

字符串數組 (字符串 [] 值)

繼續使用字符串,直到它再次以大約 10 個“NaN”字符串結尾。

我現在正在做的是總結那個數組中的所有值。

但是在這個之后還會有大約 100 個 Arrays,我需要將此數組中的值 [8] 與下一個數組中相同的 position 相加。

加起來 希望這可以更好地可視化我需要做的事情

因為我還是個學徒,所以我對這一切都沒有太多了解。

我已經嘗試了幾個小時的解決方案,但我似乎無法在這里工作。

任何幫助都會很棒!

我的代碼:

String[] values;
String returnString = "";
List<Double> valueList = new List<Double>();

DateTime time = (DateTime)skzAdapterText.MinTambourChangedTime();

DataTable profilData = skzAdapterText.LoadValuesText(time);

int rowCount = profilData.Rows.Count;

for (int i = 0; i < rowCount; i++)
{
    String SQLvalues = (String)profilData.Rows[i][2];

    values = SQLvalues.Split('#');

    double summe = 0;
    int counter = 0;

    foreach (String tmpRow in values)
    {
        Double value;
        if (double.TryParse(tmpRow, NumberStyles.Float | NumberStyles.AllowThousands, 
        CultureInfo.InvariantCulture, out value)
        && !double.IsNaN(value))
        {
            counter++;
            summe = summe + value;
        }
    }

    if (summe != 0 && counter != 0)
        valueList.Add(summe / counter);
}

基本總和可以這樣減少:

values = SQLvalues.Split('#'); 
double sum = values.Where(v => v != "NaN").Select(v => double.Parse(v)).Sum();

對於特定的 position,例如索引 8,在許多行中:

//Read the data from DB
DataTable profilData = skzAdapterText.LoadValuesText(time);

//parse out the values
var rowValueArrays = // will be a List<double[]>
    profilData.Rows.
    Select(r => r[2].Split('#').Select(v => v == "NaN"?0.0:double.Parse(v)).ToArray()).
    ToList();

// sum the entries at index 8
double sumAt8 = rowValueArrays.Select(r => r[8]).Sum();

你說你是學徒,所以這里的語法你可能不熟悉,看起來很難理解。 但我想強調這里的力量。 IEnumerable、lambda 表達式和 linq 操作的組合將原始示例減少到兩行代碼,並解決了技術上三行代碼的全部問題(為了便於閱讀,稍微展開)。 如果我想犧牲任何風格或可維護性,我們只需一行代碼就可以做到

簡而言之,花時間學習如何以這種方式編寫代碼是非常值得的。 通過練習,以這種方式閱讀和編寫代碼可以變得容易,並大大提高您作為程序員的速度和能力。

我還看到了計算平均值的嘗試。 從上一個代碼的末尾繼續:

int countAt8 = rowValuesArrays.Count(r => r[8] != 0.0);
double average = sumAt8 / countAt8;

最后,我需要指出,像這樣在列中分隔數據是對數據庫的濫用,也是非常糟糕的做法。 像這樣的模式被認為是損壞的,需要修復

由於您想總結 arrays 相同位置的值,我假設所有這些數組具有相同的長度。 然后先聲明需要的arrays。 您還必須計算每個數組 position 的平均值,因此您還需要一個用於計數器和平均值的數組。

double[] average = null;
int rowCount = profilData.Rows.Count;

if (rowCount > 0) {
    string[] values = ((string)profilData.Rows[0][2]).Split('#');
    int n = values.Length;
    double[] sum = new double[n];
    double[] counter = new double[n];
    for (int i = 0; i < rowCount; i++) {
        values = ((string)profilData.Rows[i][2]).Split('#');
        for (int j = 0; j < n; j++) {
            if (double.TryParse(values[j], NumberStyles.Float | NumberStyles.AllowThousands,
                CultureInfo.InvariantCulture, out double value) && !double.IsNaN(value)) {
                counter[j]++;
                sum[j] += value;
            }
        }
    }
    average = new double[n];
    for (int i = 0; i < n; i++) {
        if (counter[i] != 0) {
            average[i] = sum[i] / counter[i];
        }
    }
}

求和時無法計算平均值,因為您必須將總和除以總計數。 因此,我在求和階段之后添加了另一個循環來計算每個數組 position 的平均值。

暫無
暫無

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

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