摘要:[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# 程式設計手冊)