【问题标题】:Find Minimum and Maximum values within a multi dimensional struct array在多维结构数组中查找最小值和最大值
【发布时间】:2016-01-31 20:11:01
【问题描述】:

对于一个学习 c# 的学校项目,我正在制作一个数据收集控制台应用程序,它保存 4 个不同位置的浮点条目以及时间/日期以及记录该条目的用户。我需要使用多维结构数组。

我需要一个显示平均值的视图,以及最小值和最大值以及第一个和最后一个日期。我已经通过计算值并累积添加来计算平均值,但我不知道如何找到最小值和最大值。

我尝试搜索并遇到此页面:http://www.dotnetperls.com/max 由于它是一个更复杂的数组,我试图在我的代码中实现这种语法但无济于事。

它在我的整数测试中起作用:

class Program
{
    static int[][] intarray = new int[4][] { new int[10], new int[10], new int[10], new int[10] };
    static void Main(string[] args)
    {
        intarray[0][0] = 5;
        intarray[0][1] = 3;
        intarray[0][2] = 10;
        intarray[0][3] = 4;
        intarray[0][4] = 2;
        Console.WriteLine(intarray[0].Max());
        Console.ReadLine();
    }
}

上面的代码完美的显示了数字10! :)

但是当我尝试使用结构数组将其实现到我的程序中时,它不起作用:

class Program
{
    static byte location = 0;
    static float entriesmin;
    static float entriesmax;
    static Entry[][] entriesarray = new Entry[4][] { new Entry[10], new Entry[10], new Entry[10], new Entry[10] };

    struct Entry
    {
        public float value;
        public string user;
        public DateTime datetime;
    }

    static byte LoopEntries(bool display)
    {
        float runningtotal = 0;
        byte entrycount = 0;
        foreach (Entry entry in entriesarray[0])
        {
            if (entry.user != null)
            {
                if (display)
                {
                    string ten;
                    if (entrycount == 9)
                    {
                        ten = "  #";
                    }
                    else
                    {
                        ten = "   #";
                    }
                    Console.WriteLine(ten + (entrycount + 1) + " " + entry.datetime + " " + entry.user + new string(' ', 16 - entry.user.Length) + entry.value);
                }
                runningtotal += entry.value;
                entrycount += 1;                
            }
        }
        entriesmin = (entriesarray[location]).value.Min();
        entriesmax = (entriesarray[location]).value.Max();            
        if (entrycount == 0 && display)
        {
            Console.WriteLine("No entries to show!");                
        }
        return entrycount;
    }

我需要在星期一提交这个项目!我真的希望有人能帮助我! ;)

【问题讨论】:

    标签: c# max visual-studio-2015 minimum


    【解决方案1】:

    您拥有的不是多维数组,而是数组数组(也称为锯齿数组),但您可以以类似的方式使用它们。

    要遍历数组数组,你需要一个循环中的循环:

    foreach (Entry[] arr in entriesarray) {
      foreach (Entry entry in arr) {
        // ...
      }
    }
    

    您可以使用MinMax 扩展方法来获取每个内部数组的最小值和最大值,但您仍然需要找到这些值之间的最小值和最大值。由于您已经遍历所有条目以获得平均值,因此您只需记录找到的最小值和最大值:

    float runningtotal = 0;
    int entrycount = 0;
    float min = float.MaxValue;
    float max = float.MinValue;
    foreach (Entry[] arr in entriesarray) {
      foreach (Entry entry in arr) {
        runningtotal += entry.value;
        entrycount++;
        if (entry.value < min) {
          min = entry.value;
        }
        if (entry.value > max) {
          max = entry.value;
        }
      }
    }
    

    【讨论】:

    • 我只是想找到用户在不同功能/屏幕中设置的当前位置的最小值和最大值。例如[0-3] 该位置保存在一个全局变量中,该变量定义了我循环遍历的子数组。我刚刚注意到我的代码 sn-p 有错误。foreach (Entry entry in entriesarray[0]) 应该是:foreach (Entry entry in entriesarray[location]) 这就是为什么我只有 1 个 foreach 循环。我不明白float.MaxValue float.MinValue 代表什么价值? PS:感谢您的快速回复!
    • @OptimistPrime:好的,那么您可以使用我的示例中的内部循环。 float.MaxValuefloat.MinValue 用于初始化具有最高可能值的最小值和具有最低可能值的最大值。这些将被循环中的第一个值替换。
    • 完美!!是的,我在调试并查看第一次运行时最小/最大变量中保存的值时发现了这一点!非常感谢您的帮助,非常感谢,它工作得很好! :) 我可以对 DateTime 做同样的事情吗?另外,您能否解释一下为什么这不起作用:entriesmin = (entriesarray[location]).value.Min(); entriesmax = (entriesarray[location]).value.Max();
    • @OptimistPrime:是的,您可以将该原则用于任何可比较的值。要使用MinMax 方法,您需要一个转换函数来从条目中获取每个值:entriesmin = entriesarray[location].Min(entry =&gt; entry.value);entriesmax = entriesarray[location].Max(entry =&gt; entry.value);。 (请注意,这些将每个循环一次数组,因此您将有三个循环而不是一个。)
    猜你喜欢
    • 2019-03-31
    • 2015-04-06
    • 2018-01-08
    • 1970-01-01
    • 2011-05-28
    • 2018-05-03
    • 2015-02-01
    • 1970-01-01
    相关资源
    最近更新 更多