首页 文章

在C#中查找数组的最小值和最大值[重复]

提问于
浏览
0

这个问题在这里已有答案:

我正在开发一个项目,该项目涉及使用数组将CSV文件中的数据导入C#程序并返回最小值和最大值等值 . 我在实现返回最大值和最小值的方法时遇到了一些麻烦 .

样品类:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Thomas_Nicholas_E2
{
    class Samples
    {
        public double Fenner { get; set; }
        public double Abom { get; set; }

        public Samples()
        {

        }

        public void ReadCsv(StreamReader reader)
        {
            string buffer;
            string[] parts;

            // Get record from file
            buffer = reader.ReadLine();

            // Break record into components
            parts = buffer.Split(',');

           /* Array.Sort<string>(parts);
            foreach (var x in parts)
            {
                Console.WriteLine(x);
            }
            */
            // Convert field values to variable
            Fenner = Convert.ToDouble(parts[0]);
            Abom = Convert.ToDouble(parts[1]);


            // Finding the range of the datasets 
            //var sortedFenner = parts[0].OrderBy(i => i);
            //var sortedAbom = parts[1].OrderBy(i => i);
            //var sortedTotal = parts.OrderBy(i => i);
            //Console.WriteLine(sortedAbom);
            //Console.WriteLine(parts.Max());
            //double minimum1 = Math.Min(parts, parts);
            //Console.WriteLine(parts[1].Min());

            //string min = parts[0].Min();
            // Console.WriteLine(min);
            //double min = parts[1].Min();
            //Console.WriteLine(min);
        }

    }
}

你可以在Samples类底部的注释部分看到我到目前为止所尝试的内容 .

程序类以防万一:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Thomas_Nicholas_E2
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader("examdata.csv");

            string buffer;

            double totalFenner = 0.0;
            double totalAbom = 0.0;
            double total = 0.0;
            double minumum = 0.0;
            double maximum = 0.0;
            double range = 0.0;
            double meanFenner = 0.0;
            double meanAbom = 0.0;
            double meanTotal = 0.0;

            // Read header to get it out of the way
            buffer = reader.ReadLine();

            while(!reader.EndOfStream)
            {
                Samples MySamples = new Samples();
                MySamples.ReadCsv(reader);

                // Processing
                //Calculating totals
                totalFenner += MySamples.Fenner;
                totalAbom += MySamples.Abom;
                total = (totalFenner + totalAbom);

                //Calculating means
                meanFenner = (totalFenner / 20);
                meanAbom = (totalAbom / 20);
                meanTotal = (total / 40);


                // += MySamples;

                //Console.WriteLine("TransId: {0}  DeptNo: {1}  Amt: {2}", transId, deptNo, amt);
                //MyTransaction.Print();
            }
            Console.WriteLine(meanFenner);
            Console.WriteLine(meanAbom);
            Console.WriteLine(meanTotal);
            //Console.WriteLine(Samples.sortedAbom)




            reader.Close();

            Pause();
        }
        private static void Pause()
        {
            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }
    }
}

我感谢任何建议或指导,谢谢 .

3 回答

  • 0

    找到最小值/最大值非常简单 . 假设一个数组或列表,你可以简单地调用 .Min().Max() . 例如:

    var foo = new List<int> {4,3,5,9,1};
    var min = foo.Min();
    var max = foo.Max();
    
  • 1

    使用重载的Factory pattern方法在 Samples 类中构建 ReadCsv() 方法,如下所示:

    public static Samples ReadCsv(StreamReader reader)
    {
        return ReadCSv(reader.ReadLine());
    }
    
    public static Samples ReadCsv(string line)
    {
        parts = line.Split(',');
        return new Samples() {
            Fenner = Convert.ToDouble(parts[0]),
            Abom = Convert.ToDouble(parts[1])
        };
    }
    

    然后您可以使用 Main() 方法使用它,如下所示:

    static void Main(string[] args)
    {
        var samples = File.ReadLines("examdata.csv")
                     .Select(l => Samples.ReadCsv(l))
                     .ToList();
    
        double totalFenner = samples.Select(s => s.Fenner).Sum();
        double totalAbom = samples.Select(s => s.Abom).Sum();
        double total = totalFenner + totalAbom;
    
        double meanFenner = sampes.Select(s => s.Fenner).Avg();
        double meanAbom = samples.Select(s => s.Abom).Avg();
        double meanTotal = samples.Select(s => s.Fenner + s.Abom).Avg();
    
        Console.WriteLine(meanFenner);
        Console.WriteLine(meanAbom);
        Console.WriteLine(meanTotal);
    
         Pause();
    }
    

    或者像这样(更多代码,但运行更快,更容易让一些人理解):

    static void Main(string[] args)
    {
        double totalFenner = 0.0;
        double totalAbom = 0.0;
        double total = 0.0;
    
        double meanFenner = 0.0;
        double meanAbom = 0.0;
        double meanTotal = 0.0;
    
        var samples = File.ReadLines("examdata.csv")
                     .Select(l => Samples.ReadCsv(l));
    
        int count = 0;
        foreach (var sample in samples)
        {
            totalFenner += sample.Fenner;
            totalAbom += sample.Abom;
            count++;
        }
        total = totalFenner + totalAbom;
        meanTotal = total / count;
        meanFenner = totalFenner / count;
        meanAbom = totalAbom / count;
    
        Console.WriteLine(meanFenner);
        Console.WriteLine(meanAbom);
        Console.WriteLine(meanTotal);
    
         Pause();
    }
    
  • 0

    我认为为评论中看到的一些答案提供一些代码可能会有用 .

    要阅读所有行,您可以执行以下操作:

    using (StreamReader reader = new StreamReader("examdata.csv")) {
    
          while ((buffer = reader.ReadLine()) != null)
          {
             // Something
          }
    
        }
    

    然后,如果你正在使用数组,你可以像@gilliduck所说的那样做,并用 .Min().Max() 找到最小/最大值 .

相关问题