[C#] C# 中如何以迴圈方式設定 struct 內的陣列的值?

  • 11465
  • 0
  • C#
  • 2012-04-19

摘要:[C#] C# 中如何以迴圈方式設定 struct 內的陣列的值?(一點通系列 – MVP撰寫)

問題的來龍去脈

在 C++ 中,若 struct 中的元素包含有陣列,可以使用 for loop 去設定該陣列的值。如以下的程式所示:

        struct machine
        {
            int assignedJobs[12]; 
            double completion; 
        };

        void main(){
            int m = 3,n = 12; 
            for (int i = 0; i < m; i++){
                for (int j = 0; j < n; j++){
                    M[i].assignedJobs[j] = 0;
                }
                M[i].completion = 0;
            }
        }
C# 中卻不能這樣使用?
 



問題的發生原因

發生的原因在於陣列的宣告方式不正確。在 C# 中,陣列實際上是物件,而不是只像在 C 和 C++ 中可定址的連續記憶體區域而已。
 
 



問題的解決方法

1. 在定義結構時,僅定義陣列的型別。
2. 在結構執行個體化之後,再針對陣列執行個體化。
3. 陣列執行個體化之後,就可以對陣列元素設定值。
4. 例如以下的程式範例:(請新增專案時,範本請選主控台應用程式)
 


using System;

namespace ConsoleApplication1
{
    class Program
    {
         struct machine //定義結構
        {
            public int[] assignedJobs; //定義成員 assignedJobs。其型別為 一維整數陣列,預設值為 null 參考
            public double completion; //定義成員 completion。其型別為 倍精確度浮點數,預設值為 0
        }

        static void Main(string[] args)
        {
            machine[] Machine = new machine[3];

            for (int i = 0; i < Machine.Length; i++)
            {
                //宣告陣列大小並設定元素值
                Machine[i].assignedJobs = new int[12];
                for (int j = 0; j < Machine[i].assignedJobs.Length; j++)
                {
                    Machine[i].assignedJobs[j] = i * 100 + j;
                }
                /*
                 * 你也可以這樣作
                 * int j = i * 100;
                 * Machine[i].assignedJobs = new int[12] { j, j + 1, j + 2, j + 3, j + 4, j + 5, j + 6, j + 7, j + 8, j + 9, j + 10, j + 11 };
                 * 
                 * 或是這樣作
                 * int j = i * 100;
                 * Machine[i].assignedJobs = new int[] { j, j + 1, j + 2, j + 3, j + 4, j + 5, j + 6, j + 7, j + 8, j + 9, j + 10, j + 11 };
                 */
                Machine[i].completion = i + 1;
            }


            //輸出結果
            foreach (machine MachineItem in Machine)
            {
                Console.WriteLine("-------------------------------------------------------------------------------");
                Console.Write(string.Format("Completion:{0: 00} and assignedJobs:", MachineItem.completion));
                foreach (int jobs in MachineItem.assignedJobs)
                {
                    Console.Write(String.Format("{0:D3}", jobs).PadRight(4));
                }
                Console.WriteLine();
            }
            Console.Read();
        }
    }
}

 

5. 就會得到這樣的結果畫面:


 




 
其他相關資訊

  • 結構 (C# 程式設計手冊)
  • 陣列 (C# 程式設計手冊)