Эти два вопроса дают похожие альгорифты для перетаскивания IEnumerable:
- С#: использует Random и OrderBy хороший алгоритм перетасовки?
- Можете ли вы перечислить коллекцию в С# из-за порядка?
Вот два метода бок о бок:
public static IEnumerable<T> Shuffle1<T> (this IEnumerable<T> source)
{
Random random = new Random ();
T [] copy = source.ToArray ();
for (int i = copy.Length - 1; i >= 0; i--) {
int index = random.Next (i + 1);
yield return copy [index];
copy [index] = copy [i];
}
}
public static IEnumerable<T> Shuffle2<T> (this IEnumerable<T> source)
{
Random random = new Random ();
List<T> copy = source.ToList ();
while (copy.Count > 0) {
int index = random.Next (copy.Count);
yield return copy [index];
copy.RemoveAt (index);
}
}
Они в основном идентичны, за исключением того, что используется List
, и один использует массив. Понятно, что второй мне кажется более понятным. Но есть ли существенное преимущество в производительности от использования массива? Даже если время Big-O одинаковое, если оно в несколько раз быстрее, это может сделать заметную разницу.