【问题标题】:How to calculate the "average" value , "highest" value , and "Lowest" value in an array? C#如何计算数组中的“平均值”、“最高”值和“最低”值? C#
【发布时间】:2019-10-08 13:32:40
【问题描述】:

第 1 部分:我将创建一个程序,它将文件的内容读入数组,并在 ListBox 控件中显示数组的内容,并计算并显示数组值的总和。 - 完成那部分

第 2 部分:计算平均值、最高值和最低值并将它们显示在标签控件中。

我是编码新手,所以我做不了太多,我求助于堆栈溢出

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace SalesAnalysis
{
public partial class SalesAnalysisApplication : Form
{
    public SalesAnalysisApplication()
    {
        InitializeComponent();
    }

    private void salesAnalysisButton_Click(object sender, EventArgs e)
    {
        //declaring array
        const int SIZE = 100;
        decimal[] sales = new decimal[SIZE];

        //varible to hold amount stored in array
        int count = 0;



        //declaring streamreader
        StreamReader inputFile;

        //opening the sales file
        inputFile = File.OpenText("Sales.txt");

        try
        {
            //pull contents from file into array while there is still 
             // items to pull and the array isnt full

            while (!inputFile.EndOfStream && count < sales.Length)
            {
                sales[count] = decimal.Parse(inputFile.ReadLine());
                count++;
            }
            //close the file
            inputFile.Close();

            //display contents in listbox
            for (int index = 0; index < count; index++)
            {
                salesListBox.Items.Add(sales[index]);
            }


            //Calculate the sum of all values
            for (int index = 0; index < sales.Length; index++)
            {
                totalSales += sales[index];
            }
            //display total of all values
            salesListBox.Items.Add("Total =" + totalSales);


            //Determine the average sales from the array
            for (int index = 0; index < sales.Length; index++)
            {
                //calculate the average
                averageSales = totalSales / 7;
            }


        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void Clear_Click(object sender, EventArgs e)
    {
        //Clear all fields
        salesListBox.Items.Clear();
        averageResultsLabel.Text = "";
        highestResultsLabel.Text = "";
        lowestResultsLabel.Text = "";
    }

    private void exitButton_Click(object sender, EventArgs e)
    {
        //close form
        this.Close();
    }
}

}

【问题讨论】:

  • 您只需使用 IEnumerbale 的扩展方法即可完成所有这些操作
  • 也许,您无能为力,但您始终可以将问题拆分为更小的部分。例如,您要询问三个不同的值:从一个开始,即平均值。第二步:你已经知道如何为标签赋值,你只需要计算数组元素的平均值,这里已经问过这个问题:how can i return the sum , average of an int array
  • decimal[] sales = File.ReadLines("Sales.txt").Select(line =&gt; decimal.Parse(line)).ToArray(); - 您不必使用流
  • @MongZhu 谢谢大佬,好记号,谢谢你!

标签: c# arrays winforms


【解决方案1】:

您可以使用 linq 来执行此操作,例如:

    var list=Enumerable.Range(0,1000);

    var average = list.Average();

    var highest = list.Max()

    var smallest= list.Min()

    var total= list.Sum()

P.S别忘了加using System.Linq;

【讨论】:

    【解决方案2】:

    首先将你的Decimal数组转换为List。

    List<decimal> lst = sales.OfType<decimal>().ToList(); // Convert to List.
    

    然后关注Linq Operations。

    lst.Average(); lst.Min(); 
    

    【讨论】:

    • 1) 为什么使用 OfType ?一个简单的sales.ToList() 会做同样的事情 2) 哪里需要将数组转换为列表?一个decimal [ ] 实现IEnumerable,这个接口定义了AverageMin 方法。所以数组可以自己调用这些方法
    • OfType 是多余的,因为所有元素都是十进制的,而 ToList 是不必要的,因为 Min/Max/Avg 是在数组已经实现的 IEnumerable 上定义的。
    【解决方案3】:

    非 linq 方法。

    您有一个sales.Length 和一个totalSales。因此,您有一个averageSales

    对于最大值和最小值,当您在 for 循环中时

    for (int index = 0; index < sales.Length; index ++ 
      {
        if (sales
      }
    

    只需根据if 语句分配值。比如:

    if (sales[index] > highestSales) 
    {
      highestSales = sales[index];
    }
    if (sales[index] < lowestSales)
    {
      lowestSales = sales[index];
    }
    

    【讨论】:

    • 我正在尝试您的非 linq 解决方案,但仍有问题。有什么办法可以把程序发给你?
    • @MozzJonas 看看编辑是否有帮助。你计算出平均销售额了吗?
    • @MozzJonas 我在我的 cmets 中问你这些问题是有原因的。我想帮助你自己开发算法。你愿意回答他们吗?
    • @MozzJonas 想象你有 10 个人站成一排。你从第一个走到最后一个。你会如何找到最有才华的人?你会检查第一个他是否比0高,如果是,那么你会记住那个人,然后去下一个,比较他是否比你记忆中的那个高。如果是这样,你会用新人覆盖你的记忆等等
    【解决方案4】:

    如果你更喜欢旧的 loop(而不是 Linq),你可以试试 File.ReadLinesforeach

      decimal max = 0;
      decimal min = 0;
      decimal sum = 0;
      int count = 0;      
    
      foreach(string line in File.ReadLines("Sales.txt")) {
        decimal value = decimal.Parse(line);
    
        salesListBox.Items.Add(value);
    
        if (count == 0 || value > max)
          max = value;
    
        if (count == 0 || value < min)
          min = value;
    
        sum += value;
        count += 1;   
      } 
    
      decimal average = sum / count; 
    
      averageResultsLabel.Text = average.ToString("f2");
      highestResultsLabel.Text = max.ToString();
      lowestResultsLabel.Text = min.ToString();
    

    这里我们根本不需要创建任何数组。如果您坚持使用数组,一个简单的 Linq 可以提供帮助

      decimal[] sales = File
        .ReadLines("Sales.txt")
        .Select(line => decimal.Parse(line))
        .ToArray();
    

    foreach 将是

      foreach(decimal value in sales) {
        salesListBox.Items.Add(value);
        ... 
      }      
    

    【讨论】:

    • 是的,非常好和简单。但不幸的是我需要使用数组才能获得满分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多