如何在文本文件中找到所有数字的平均值

3

我在这个问题上卡住了。下面的代码将文本文件Dailyfile中所有数字相加,并将总和输出到AverageFile。问题是我不想让它相加,我想找出所有数字的平均值

我该怎么办?

Dim AverageFile As String = "C:\xxx\zzz\" & System.DateTime.Now.ToString("yyyyMMdd") & ".txt"
Dim DailyFile As String = "C:\xxx\xxx\" & System.DateTime.Now.ToString("yyyyMMdd") & ".txt"  

            Try
                If System.IO.File.Exists(AverageFile) Then
                    Dim total As double = 0
                    For Each line As String In IO.File.ReadAllLines(DailyFile)

                        total += Double.Parse(line)
                    Next
                    Dim objWriter As New System.IO.StreamWriter(AverageFile, false)
                    objWriter.WriteLine(total.ToString) 
                    objWriter.Close()
                Else
                    'Nothing yet
                End If

            Catch ex As Exception
                lbErrors.Items.Add(String.Concat(TimeOfDay & " Error 98: File or folder might not exist. Restart application... ", ex.Message))
            End Try

Dailyfile 就像这样:

enter image description here

我已经尝试了很多 total 0= double.parse(line) 的变化,因为我感觉问题就在那里。我也试过 diming the total as integer = 0。但我刚刚开始学习计算,所以不太清楚具体情况。


2
尝试使用 File.ReadAllLines(path).Select(double.Parse).Average() - Enigmativity
2个回答

3

平均值就是将总数除以相加的数量。(假设你想使用算术平均数,这也许是你要找的内容。)

Dim total As double = 0
Dim numOfLines As Integer = 0
For Each line As String In IO.File.ReadAllLines(DailyFile)
    numOfLines += 1
    total += Double.Parse(line)
Next
Dim average As Double = total / numOfLines
Dim objWriter As New System.IO.StreamWriter(AverageFile, false)
objWriter.WriteLine(average.ToString) 
objWriter.Close()

你的代码缺少的是跟踪行数并将总和除以此数量。举个例子:我们有3个人,我23岁,你35岁,我们的朋友40岁。我们年龄的平均值为(23 + 35 + 40) / 3,即32.666...

谢谢,CherryDT。这正是我所缺少的。 - MadsTheMan
有点晚了,但是这个问题是否可以进行一些小的调整,以便我能够得到32而不是32.666这样的输出? - MadsTheMan
1
如果你想要一直向下取整(就像你的例子一样),你可以在结尾处使用 Math.floor(average) 而不是 average(例如 objWriter.WriteLine(Math.floor(average).ToString))。如果你想要使用银行家舍入法(即 32.4 变成 32,但 32.6 变成 33),请使用 Math.round(average, 0) - CherryDT

3

可以使用 CherryDT的方法计算行数并将总数除以此数字,或者使用LINQ的 Enumerable.Average ,例如使用以下简洁的查询:

Dim allNumbers = From line In IO.File.ReadLines(DailyFile)
                 Let num = line.TryGetDouble()
                 Where num.HasValue
                 Select num.Value
Dim average As Double = allNumbers.Average()

我已使用以下 扩展方法 尝试将字符串解析为 Nullable(Of Double):
Imports System.Runtime.CompilerServices

Module StringExtensions
    <Extension()>
    Public Function TryGetDouble(ByVal str As String) As Nullable(Of Double)
        If str Is Nothing Then Return Nothing
        Dim d As Double
        If Double.TryParse(str.Trim(), d) Then
            Return d
        Else
            Return Nothing
        End If
    End Function
End Module

谢谢你的回答,Tim,并且讲得如此详细。我正在吸收你传授给我的知识,并将探索其中的可能性。 - MadsTheMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接