Нижний регистр string
является псевдонимом для System.String
. Они - то же в C#
.
существуют дебаты, законченные, необходимо ли использовать Системные типы (System.Int32
, System.String
, и т.д.) типы или C# aliases
(int
, string
, и т.д.). Я лично полагаю, что необходимо использовать эти C# aliases
, но это - просто мое персональное предпочтение.
Другой вариант - использовать OrderBy и отсортировать по значению GUID, что можно сделать с помощью:
var result = sequence.OrderBy(elem => Guid.NewGuid());
Я провел несколько эмпирических тестов, чтобы убедить себя в том, что приведенное выше фактически генерирует случайное распределение (что, похоже, и происходит). Вы можете увидеть мои результаты в Методы случайного переупорядочения массива .
В дополнение к ответу mquander и комментарию Дэна Бланшара, вот дружественный к LINQ метод расширения, который выполняет перемешивание Fisher-Yates-Durstenfeld :
// take n random items from yourCollection
var randomItems = yourCollection.Shuffle().Take(n);
// ...
public static class EnumerableExtensions
{
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
{
return source.Shuffle(new Random());
}
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
{
if (source == null) throw new ArgumentNullException("source");
if (rng == null) throw new ArgumentNullException("rng");
return source.ShuffleIterator(rng);
}
private static IEnumerable<T> ShuffleIterator<T>(
this IEnumerable<T> source, Random rng)
{
var buffer = source.ToList();
for (int i = 0; i < buffer.Count; i++)
{
int j = rng.Next(i, buffer.Count);
yield return buffer[j];
buffer[j] = buffer[i];
}
}
}
Здесь есть некоторые проблемы со "случайным смещением", и я уверен, что это не оптимально, это еще одна возможность:
var r = new Random();
l.OrderBy(x => r.NextDouble()).Take(n);
Извините за некрасивый код :-), но
var result =yourCollection.OrderBy(p => (p.GetHashCode().ToString() + Guid.NewGuid().ToString()).GetHashCode()).Take(n);
Перемешайте коллекцию в случайном порядке и возьмите первые n
элементов из результата.