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

C# LINQ 按比例混合兩個數組:先按比例取樣再打亂,避免複雜 Lambda

     編輯:程式設計綜合問答

需求

兩個數組 A、B,按 50%:50% 比例混合生成新數組,要求用 LINQ/Lambda,不寫顯式循環。

簡潔方案:Take + Concat + OrderBy(Guid)

var mixed = A.Take(A.Length / 2)
             .Concat(B.Take(B.Length / 2))
             .OrderBy(_ => Guid.NewGuid())  // 打亂
             .ToArray();

泛化:任意比例、任意數量數組

public static T[] MixProportional<T>(params (T[] Array, double Ratio)[] sources) {
    var rnd = new Random();
    return sources
        .SelectMany(s => s.Array.Take((int)(s.Array.Length * s.Ratio)))
        .OrderBy(_ => rnd.Next())  // 或 Guid.NewGuid()
        .ToArray();
}

// 用法
var result = MixProportional(
    (arr1, 0.5),
    (arr2, 0.3),
    (arr3, 0.2)
);

避坑指南

  • OrderBy(_ => Guid.NewGuid()) 利用 GUID 隨機性打亂,**簡潔但非加密級隨機**;嚴格場景用 Random 或 RandomNumberGenerator。
  • 比例計算 (int)(Length * Ratio) 會截斷,總長度可能不等於預期,按需四捨五入或調整最後一組。
  • 大數組(>10^6)OrderBy 內存/性能壓力大,考慮 **Fisher-Yates 原地洗牌** 或分流處理。

總結

LINQ 混合數組按比例:**Take 切片 → Concat 合併 → OrderBy 打亂**。比手寫循環+隨機交換更聲明式、可讀性強,中小數據量完全足夠。

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