闽公网安备 35020302035485号
前言
在 .NET 8 Preview 1 中引入了两个非常实用的 Random 方法,GetItems 和 Shuffle,下面我们简单的看个简单的示例吧
private static readonly char[] ConstantNumbers = new[]
{
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9'
};
var randomCodeChars = Random.Shared.GetItems(ConstantNumbers, 6);
var randomCode = new string(randomCodeChars);
Console.WriteLine(randomCode);
输出结果如下:
var charArray = new char[6]; Random.Shared.GetItems(ConstantNumbers, charArray.AsSpan()); Console.WriteLine(new string(charArray));效果和前面的基本一样
// 堆代码 duidaima.com
public void GetItems<T>(ReadOnlySpan<T> choices, Span<T> destination)
{
if (choices.IsEmpty)
throw new ArgumentException(SR.Arg_EmptySpan, nameof(choices));
for (int i = 0; i < destination.Length; i++)
{
destination[i] = choices[Next(choices.Length)];
}
}
public T[] GetItems<T>(T[] choices, int length)
{
ArgumentNullException.ThrowIfNull(choices);
return GetItems(new ReadOnlySpan<T>(choices), length);
}
public T[] GetItems<T>(ReadOnlySpan<T> choices, int length)
{
if (length < 0)
throw new ArgumentOutOfRangeException(nameof(length), SR.ArgumentOutOfRange_NeedNonNegNum);
T[] items = new T[length];
GetItems<T>(choices, items.AsSpan());
return items;
}
var nums = Enumerable.Range(1, 10).ToArray();
Random.Shared.Shuffle(nums);
Console.WriteLine($"Numbers shuffled:\n {JsonSerializer.Serialize(nums)}");
输出结果类似下面这样:
public void Shuffle<T>(T[] values)
{
ArgumentNullException.ThrowIfNull(values);
Shuffle<T>(values.AsSpan());
}
public void Shuffle<T>(Span<T> values)
{
int n = values.Length;
for (int i = 0; i < n - 1; i++)
{
int j = Next(i, n);
if (j != i)
{
T temp = values[i];
values[i] = values[j];
values[j] = temp;
}
}
}
其它string GetString(ReadOnlySpan<char> choices, int length)
string GetHexString(int stringLength, bool lowercase = false)
void GetHexString(Span<char> destination, bool lowercase = false)
public static void GetString()
{
var randomCode = RandomNumberGenerator.GetString(ConstantNumbers, 6);
Console.WriteLine(randomCode);
}
public static void GetHexString()
{
var randomHexString = RandomNumberGenerator.GetHexString(6);
Console.WriteLine(randomHexString);
var charArray = new char[6];
RandomNumberGenerator.GetHexString(charArray, true);
Console.WriteLine(new string(charArray));
}
