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

關於作者:

本文由微軟最有價值專家 MVP 李敍慶 提供。微軟十分感謝 MVP 主動地將他們的經驗與上百萬名其他技術使用者交流。MVP 李敍慶 同時也將此篇文章放在他的部落格內,歡迎您按 此處 瀏覽 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. 就會得到這樣的結果畫面:


輸出結果


請讓我們知道
請讓我們知道還滿意我們寫的內容嗎?無論您是遇到了以下任何一種情況:
「太好了!問題解決了。」
「問題沒有解決,我有更好的建議。」
都歡迎您利用本篇文章底部的意見調查表,寫下您寶貴的意見。也期待您的鼓勵,讓我們為您創造更多實用的技術文章。
內容

文章識別碼:2701274 - 最後檢閱時間:05/19/2014 02:02:00 - 修訂: 1.3

Microsoft Visual C# 2005, Microsoft Visual C# 2005 Express Edition, Microsoft Visual C# 2008 Express Edition, Microsoft Visual C# 2010 Express

  • kbprb kbtshoot kbstepbystep kbgraphxlink kbmvp kbexpertisebeginner KB2701274
意見反應