在编程领域,通常需要从给定集合中提取随机子集。对于 LINQ 爱好者,您可能想知道实现此目的的最佳方法。
一种方法是利用 .Shuffle() 扩展方法,该方法执行 Fisher-Yates-Durstenfeld shuffle。此方法有效地随机化集合中元素的顺序,使其成为创建随机子集合的理想解决方案。
为了说明其用法,我们假设您有一个名为 yourCollection 的集合,其中包含 N 个项目,并且想要提取 n 个随机项目,其中 n
var randomItems = yourCollection.Shuffle().Take(n);
此代码首先进行随机播放使用 .Shuffle() 方法获取 yourCollection 中的元素。然后,它使用 .Take() 方法从打乱的集合中提取前 n 个项目。结果是计数 n 的随机子集合。
以下是自己实现 .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]; } } }
通过使用此扩展方法,您可以轻松地从 LINQ 查询中打乱并提取任意大小的随机子集合。该技术为常见的数据操作任务提供了便捷高效的解决方案。
以上是获取随机子集的最佳 LINQ 方法是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!