最佳化LINQ:取得隨機打亂的子集合
決定檢索較大集合的隨機子集的有效方法是一個常見的挑戰編程。對於 LINQ 查詢,一種方法是利用 Shuffle() 擴充方法。
Shuffle 方法:
Shuffle() 方法採用 IEnumerable 集合作為其輸入並傳回它的打亂版本。當需要取得集合中元素的隨機順序時,此方法特別有用。
Fisher-Yates-Durstenfeld Shuffle:
Shuffle() 方法採用Fisher-Yates-Durstenfeld 混洗演算法,該演算法提供了一種穩健且高效的演算法洗集合方法。此演算法涉及迭代集合,同時與後續元素隨機交換元素。
LINQ 擴充方法:
以下是一個 LINQ 友善的擴充方法,它實作了 Fisher-與 IEnumerable 一起使用的 Yates-Durstenfeld shuffle集合:
public static class EnumerableExtensions { public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source) { return source.Shuffle(new Random()); } public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng) { if (source == null) throw new ArgumentNullException(nameof(source)); if (rng == null) throw new ArgumentNullException(nameof(rng)); return source.ShuffleIterator(rng); } private static IEnumerable<T> ShuffleIterator<T>( this IEnumerable<T> source, Random rng) { var buffer = source.ToList(); for (int i = 0; i < buffer.Count; i++) { int j = rng.Next(i, buffer.Count); yield return buffer[j]; buffer[j] = buffer[i]; } } }
用法:
要使用Shuffle() 方法,您只需在所需的集合上呼叫它即可:
var yourCollection = new List<int> { 1, 2, 3, 4, 5 }; var randomItems = yourCollection.Shuffle().Take(3);
這將從您的收藏中產生3 個隨機項目的隨機集合。預設情況下,Shuffle() 方法使用新的 Random() 實例進行隨機化。您也可以為自訂洗牌行為指定自訂 Random 實例。
以上是如何使用 LINQ 從集合中高效率取得隨機子集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!