admin管理员组文章数量:1028311
dotnet 10 新的 LINQ 方法 Shuffle
dotnet 10 新的 LINQ 方法 Shuffle
Intro
dotnet 10 中引入了一个新的 LINQ 方法 Shuffle
可以将一个集合中的元素随机洗牌返回
New API
新引入的 API 定义如下:
代码语言:javascript代码运行次数:0运行复制namespace System.Linq;
publicstaticclassEnumerable
{
publicstatic IEnumerable<T> Shuffle<T>(this IEnumerable<T> source) { }
}
publicstaticclassAsyncEnumerable
{
publicstatic IAsyncEnumerable<T> Shuffle<T>(this IAsyncEnumerable<T> source) { }
}
publicstaticclassQueryable
{
publicstatic IQueryable<T> Shuffle<T>(this IQueryable<T> source) { }
}
Sample
代码语言:javascript代码运行次数:0运行复制var source = Enumerable.Range(1, 5).ToArray();
Console.WriteLine(string.Join(",", source));
source.Shuffle();
Console.WriteLine(string.Join(",", source));
大家可以先猜一下输出结果会是什么,输出结果如下:
output
从上面的输出结果可以看得出来,原来的数组 source
中的元素并未改变,这是因为 Shuffle
方法并不会改变原有数组,而是返回一个新的 IEnumerable
对象
我们再来做一些测试,看看返回的数据,测试代码如下:
代码语言:javascript代码运行次数:0运行复制var source = Enumerable.Range(1, 5).ToArray();
Console.WriteLine(string.Join(",", source.Shuffle()));
Console.WriteLine(string.Join(",", source.Shuffle().Take(3)));
Console.WriteLine(string.Join(",", source.Shuffle().Take(3)));
Console.WriteLine(string.Join(",", source.Shuffle().Take(6)));
输出结果如下:
output2
那么如果是同一个 Shuffle
返回值,两次会不会一样呢,我们也来做一个测试
var source = Enumerable.Range(1, 5).ToArray();
var shuffled = source.Shuffle();
Console.WriteLine(string.Join(",", shuffled));
Console.WriteLine(string.Join(",", shuffled));
输出结果如下:
output3
可以看到即使是同一个 shuffle 返回值的对象,每次使用时也不相同,实际数据的填充是遍历时获取的,并不是提前生成好的,确定的
如果需要对数组进行重排可以使用 .NET 8 引入的 Random.Shuffle
方法,使用示例如下:
Console.WriteLine("Random.Shared.Shuffle(array) sample");
var array = Enumerable.Range(1, 10).ToArray();
Console.WriteLine(string.Join(",", array));
Random.Shared.Shuffle(array);
Console.WriteLine(string.Join(",", array));
输出结果如下:
Random.Shared.Shuffle
output
References
- .NET 8 Preview 1 中新增的 Random 方法
dotnet 10 新的 LINQ 方法 Shuffle
dotnet 10 新的 LINQ 方法 Shuffle
Intro
dotnet 10 中引入了一个新的 LINQ 方法 Shuffle
可以将一个集合中的元素随机洗牌返回
New API
新引入的 API 定义如下:
代码语言:javascript代码运行次数:0运行复制namespace System.Linq;
publicstaticclassEnumerable
{
publicstatic IEnumerable<T> Shuffle<T>(this IEnumerable<T> source) { }
}
publicstaticclassAsyncEnumerable
{
publicstatic IAsyncEnumerable<T> Shuffle<T>(this IAsyncEnumerable<T> source) { }
}
publicstaticclassQueryable
{
publicstatic IQueryable<T> Shuffle<T>(this IQueryable<T> source) { }
}
Sample
代码语言:javascript代码运行次数:0运行复制var source = Enumerable.Range(1, 5).ToArray();
Console.WriteLine(string.Join(",", source));
source.Shuffle();
Console.WriteLine(string.Join(",", source));
大家可以先猜一下输出结果会是什么,输出结果如下:
output
从上面的输出结果可以看得出来,原来的数组 source
中的元素并未改变,这是因为 Shuffle
方法并不会改变原有数组,而是返回一个新的 IEnumerable
对象
我们再来做一些测试,看看返回的数据,测试代码如下:
代码语言:javascript代码运行次数:0运行复制var source = Enumerable.Range(1, 5).ToArray();
Console.WriteLine(string.Join(",", source.Shuffle()));
Console.WriteLine(string.Join(",", source.Shuffle().Take(3)));
Console.WriteLine(string.Join(",", source.Shuffle().Take(3)));
Console.WriteLine(string.Join(",", source.Shuffle().Take(6)));
输出结果如下:
output2
那么如果是同一个 Shuffle
返回值,两次会不会一样呢,我们也来做一个测试
var source = Enumerable.Range(1, 5).ToArray();
var shuffled = source.Shuffle();
Console.WriteLine(string.Join(",", shuffled));
Console.WriteLine(string.Join(",", shuffled));
输出结果如下:
output3
可以看到即使是同一个 shuffle 返回值的对象,每次使用时也不相同,实际数据的填充是遍历时获取的,并不是提前生成好的,确定的
如果需要对数组进行重排可以使用 .NET 8 引入的 Random.Shuffle
方法,使用示例如下:
Console.WriteLine("Random.Shared.Shuffle(array) sample");
var array = Enumerable.Range(1, 10).ToArray();
Console.WriteLine(string.Join(",", array));
Random.Shared.Shuffle(array);
Console.WriteLine(string.Join(",", array));
输出结果如下:
Random.Shared.Shuffle
output
References
- .NET 8 Preview 1 中新增的 Random 方法
本文标签: dotnet 10 新的 LINQ 方法 Shuffle
版权声明:本文标题:dotnet 10 新的 LINQ 方法 Shuffle 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747509086a2169764.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论