首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 課程表添加表頭:LINQ Select 索引重構實現星期標題列

     編輯:程式設計綜合問答

需求

在課程表左側添加「星期一」~「星期五」表頭列,輸出格式:

       星期一  星期二  星期三  星期四  星期五
第1節  語文   數學   英語   語文   數學
第2節  數學   語文   數學   英語   語文
...

核心修改:Select 重載帶索引

// 原代碼:無表頭
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();
        }
    }
}

關鍵點

  • `Select((item, index) => ...)` 獲取索引,構建表頭
  • `new[] { header }.Concat(rest)` 合併表頭與數據行
  • 輸出循環列數從 6 → 7 (含表頭行)
  • 保持原有約束驗證與連排邏輯不變

LINQ 函數式風格靈活組合數據結構,添加表頭只需一行 `Select` 重載。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved