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

C# 實現去極值平均數:LINQ 一行代碼解決

     編輯:程式設計綜合問答

題目要求

輸入 10 個整數,移除最大值與最小值各一個,計算剩餘 8 個數的平均值。

LINQ 簡潔解法

int[] data = new int[10];
for (int i = 0; i < 10; i++)
    data[i] = int.Parse(Console.ReadLine());

double avg = data.OrderBy(x => x).Skip(1).Take(8).Average();
Console.WriteLine(avg);

步驟拆解

  1. OrderBy(x => x):升序排序
  2. Skip(1):跳過最小值 (第 1 個)
  3. Take(8):取中間 8 個
  4. Average():計算平均值 (自動返回 double)

傳統循環寫法 (教學對照)

int[] data = new int[10];
for (int i = 0; i < 10; i++) data[i] = int.Parse(Console.ReadLine());

Array.Sort(data); // 排序
int sum = 0;
for (int i = 1; i < 9; i++) // 索引 1~8
    sum += data[i];
double avg = sum / 8.0; // 注意 8.0 強制浮點除法
Console.WriteLine(avg);

邊界情況處理

  • 輸入非整數 → int.TryParse 循環驗證
  • 重複最大/最小值 → Skip/Take 只移除各一個,符合「去掉一個最大值、一個最小值」語義
  • 數據量不固定 10 個 → 封裝為通用方法 double TrimmedMean(int[] arr, int trimCount = 1)

通用擴展方法

public static class ArrayExtensions {
    public static double TrimmedMean(this int[] source, int trim = 1) {
        if (source == null || source.Length <= 2 * trim) 
            throw new ArgumentException("數據量不足以去極值");
        return source.OrderBy(x => x).Skip(trim).Take(source.Length - 2 * trim).Average();
    }
}

// 使用
double avg = data.TrimmedMean(1);

性能提示

數據量極大 (百萬級) 時,OrderBy O(n log n) 可優化為 QuickSelect O(n) 找第 k 小,但 10 個數完全無性能壓力,優先可讀性。

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