优化 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中文网其他相关文章!