Se utilizzi .NET 3.5, puoi utilizzare la seguente funzionalità IEnumerable (VB.NET, non C #, ma l'idea dovrebbe essere chiara ...):
Random rnd=new Random();
string[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();
Modifica: OK ed ecco il codice VB.NET corrispondente:
Dim rnd As New System.Random
Dim MyRandomArray = MyArray.OrderBy(Function() rnd.Next()).ToArray()
Seconda modifica, in risposta alle osservazioni che System.Random "non è thread-safe" e "adatto solo per app giocattolo" a causa della restituzione di una sequenza basata sul tempo: come usato nel mio esempio, Random () è perfettamente sicuro per i thread, a meno che stai permettendo alla routine in cui casualmente l'array di essere reinserito, nel qual caso avrai bisogno di qualcosa di simile lock (MyRandomArray)
per non danneggiare i tuoi dati, che proteggeranno rnd
anche.
Inoltre, dovrebbe essere ben compreso che System.Random come fonte di entropia non è molto forte. Come indicato nella documentazione di MSDN , è necessario utilizzare qualcosa derivato System.Security.Cryptography.RandomNumberGenerator
se si sta eseguendo operazioni relative alla sicurezza. Per esempio:
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]);
}