首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 一行代碼實現 List 隨機打亂(Fisher-Yates 思想)

     編輯:關於C語言

Java 的 Collections.shuffle 讓人羨慕,C# 雖無內建方法,但利用 List.Insert 在隨機索引插入元素,即可以極簡代碼實現高效亂序。

核心代碼

Random random = new Random();
List<Content> newList = new List<Content>();
foreach (Content item in ContentList)
{
    newList.Insert(random.Next(newList.Count + 1), item);
}
return newList;

原理解析

  • 遍歷原列表,每次在新列表的隨機位置(0 到當前長度)插入元素。
  • 等價於 Fisher-Yates 洗牌算法的「從空列表構建」變體,時間複雜度 O(n²)(因 Insert 需移動元素),但代碼極簡,適合中小數據量(<10 萬)場景。
  • 大數據量建議改用 OrderBy(x => random.Next()) 或手寫原地交換版 Fisher-Yates(O(n))。

擴展建議

封裝為擴展方法:

public static void Shuffle<T>(this IList<T> list, Random rng = null)
{
    rng ??= new Random();
    int n = list.Count;
    while (n > 1)
    {
        int k = rng.Next(n--);
        (list[n], list[k]) = (list[k], list[n]);
    }
}

原地交換,O(n) 時間、O(1) 空間,生產環境首選。

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