Si vous êtes sur .NET 3.5, vous pouvez utiliser la fraîcheur IEnumerable suivante (VB.NET, pas C #, mais l'idée doit être claire ...):
Random rnd=new Random();
string[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();
Edit: OK et voici le code VB.NET correspondant:
Dim rnd As New System.Random
Dim MyRandomArray = MyArray.OrderBy(Function() rnd.Next()).ToArray()
Deuxième modification, en réponse aux remarques selon lesquelles System.Random "n'est pas threadsafe" et "ne convient que pour les applications de jouets" en raison du retour d'une séquence temporelle: comme utilisé dans mon exemple, Random () est parfaitement thread-safe, sauf si vous permettez à la routine dans laquelle vous randomisez le tableau d'être ré-entrée, auquel cas vous aurez besoin de quelque chose comme de lock (MyRandomArray)
toute façon afin de ne pas corrompre vos données, ce qui protégera rnd
également.
En outre, il faut bien comprendre que System.Random en tant que source d'entropie n'est pas très puissant. Comme indiqué dans la documentation MSDN , vous devez utiliser quelque chose dérivé de System.Security.Cryptography.RandomNumberGenerator
si vous faites quelque chose lié à la sécurité. Par exemple:
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]);
}