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 返回值,两次会不会一样呢,我们也来做一个测试

代码语言:javascript代码运行次数:0运行复制
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 方法,使用示例如下:

代码语言:javascript代码运行次数:0运行复制
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 方法
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-25,如有侵权请联系 cloudcommunity@tencent 删除测试数据数组linqshuffle

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 返回值,两次会不会一样呢,我们也来做一个测试

代码语言:javascript代码运行次数:0运行复制
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 方法,使用示例如下:

代码语言:javascript代码运行次数:0运行复制
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 方法
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-25,如有侵权请联系 cloudcommunity@tencent 删除测试数据数组linqshuffle

本文标签: dotnet 10 新的 LINQ 方法 Shuffle