兩個數組 A、B,按 50%:50% 比例混合生成新數組,要求用 LINQ/Lambda,不寫顯式循環。
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) 會截斷,總長度可能不等於預期,按需四捨五入或調整最後一組。OrderBy 內存/性能壓力大,考慮 **Fisher-Yates 原地洗牌** 或分流處理。LINQ 混合數組按比例:**Take 切片 → Concat 合併 → OrderBy 打亂**。比手寫循環+隨機交換更聲明式、可讀性強,中小數據量完全足夠。