[英]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.