Если вы используете .NET 3.5, вы можете использовать следующую крутость IEnumerable (VB.NET, а не C #, но идея должна быть ясной ...):
Random rnd=new Random();
string[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();
Редактировать: ОК, и вот соответствующий код VB.NET:
Dim rnd As New System.Random
Dim MyRandomArray = MyArray.OrderBy(Function() rnd.Next()).ToArray()
Второе редактирование в ответ на замечания о том, что System.Random «не является поточно-ориентированным» и «подходит только для игрушечных приложений» из-за возврата последовательности, основанной на времени: как используется в моем примере, Random () идеально безопасно, если только вы не разрешаете повторный ввод массива для повторного ввода массива, и в любом случае вам понадобится что-то вроде lock (MyRandomArray)
, чтобы не повредить ваши данные, что также защитит rnd
,
Кроме того, следует понимать, что System.Random как источник энтропии не очень силен. Как отмечено в документации MSDN , вы должны использовать что-то, полученное из System.Security.Cryptography.RandomNumberGenerator
, если вы делаете что-то связанное с безопасностью. Например:
using System.Security.Cryptography;
...
RNGCryptoServiceProvider rnd = new RNGCryptoServiceProvider();
string[] MyRandomArray = MyArray.OrderBy(x => GetNextInt32(rnd)).ToArray();
...
static int GetNextInt32(RNGCryptoServiceProvider rnd)
{
byte[] randomInt = new byte[4];
rnd.GetBytes(randomInt);
return Convert.ToInt32(randomInt[0]);
}