2015-10-31 68 views
0

對於學習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; 
    } 

我需要在週一交出這個項目!我真的希望有人能幫助我! ;)

回答

1

你擁有的不是一個多維數組,它是一個數組數組(a.k.a.一個參差不齊的數組),但是你以類似的方式使用它們。

要通過數組的數組循環需要一個循環,一個循環:

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

我只是試圖找到當前位置的最小值和最大值這由用戶在不同的功能/屏幕中設置。例如[0-3]該位置保存在一個全局變量中,該全局變量定義了我循環的子陣列。我只注意到我的代碼片段中有錯誤.. 'foreach(Entry entry in entriesarray [0])' 應該是: 'foreach(Entry entry in entriesarray [location])' 這就是爲什麼我只有1 foreach循環。 我不明白'float.MaxValue float.MinValue' 代表什麼值? PS:謝謝你的快速反應! – OptimistPrime

+0

@OptimistPrime:好的,那麼你可以使用我的例子中的內部循環。 'float.MaxValue'和'float.MinValue'用於初始化最小可能值和最小可能值。這些將被循環中的第一個值所取代。 – Guffa

+0

完美!是的,當我在第一次運行時調試並查看最小/最大變量中的值時,我發現了它!謝謝你的幫助,非常感謝,它奇妙地工作! :)我可以用DateTime做同樣的事嗎? 另外,你能解釋爲什麼這不起作用: 'entriesmin =(entriesarray [location]).value。MIN(); entriesmax =(entriesarray [location])。value.Max();' – OptimistPrime