在課程表左側添加「星期一」~「星期五」表頭列,輸出格式:
星期一 星期二 星期三 星期四 星期五
第1節 語文 數學 英語 語文 數學
第2節 數學 語文 數學 英語 語文
...
// 原代碼:無表頭
result = result.Select(x => x.OrderBy(...).ToArray()).ToArray();
// 修改後:帶索引 Select,預置表頭
string[] weekDays = { "一", "二", "三", "四", "五" };
result = result.Select((day, dayIndex) =>
new[] { "星期" + weekDays[dayIndex] } // 表頭元素
.Concat(day
.OrderBy(c => c == "自修課" ? 1 : 0)
.ThenBy(_ => Guid.NewGuid())
.GroupBy(c => c)
.SelectMany(g => g)
).ToArray()
).ToArray();
// 輸出循環調整:列數變 7 (含表頭)
for (int period = 0; period < 7; period++) {
for (int day = 0; day < 5; day++) {
Console.Write(result[day][period] + "\t");
}
Console.WriteLine();
}
using System;
using System.Linq;
class Program {
static void Main() {
string[] courses = { "體育課", "體育課", "美術課", "音樂課", "勞動課",
"語文課", "數學課", "英語課" };
string[] weekDays = { "一", "二", "三", "四", "五" };
var schedule = Enumerable.Range(0, 5)
.Select(_ => Enumerable.Range(0, 6).Select(__ => "").ToArray())
.ToArray();
Random rnd = new Random();
while (!schedule.All(d =>
d.Contains("語文課") && d.Contains("數學課") &&
d.Contains("英語課") && d.Contains("自修課"))) {
var shuffled = Enumerable.Range(0, 30).OrderBy(_ => rnd.Next()).ToArray();
for (int d = 0; d < 5; d++) {
int pos = 0;
string[] core = { "語文課", "數學課", "英語課" };
for (int p = 0; p < 6; p++) {
int idx = d * 6 + p;
if (Array.IndexOf(shuffled, idx) < courses.Length) {
schedule[d][p] = courses[Array.IndexOf(shuffled, idx)];
} else {
schedule[d][p] = (pos < 3) ? core[pos++] : "自修課";
}
}
}
}
// 添加表頭 + 同課連排
schedule = schedule.Select((day, i) =>
new[] { "星期" + weekDays[i] }
.Concat(day
.OrderBy(c => c == "自修課" ? 1 : 0)
.ThenBy(_ => rnd.Next())
.GroupBy(c => c)
.SelectMany(g => g)
).ToArray()
).ToArray();
// 輸出
Console.WriteLine("節次\t星期一\t星期二\t星期三\t星期四\t星期五");
for (int p = 0; p < 7; p++) {
Console.Write((p == 0 ? "表頭" : "第" + p + "節") + "\t");
for (int d = 0; d < 5; d++) {
Console.Write(schedule[d][p] + "\t");
}
Console.WriteLine();
}
}
}
LINQ 函數式風格靈活組合數據結構,添加表頭只需一行 `Select` 重載。