Перемешивание списка строк в C # Windows phone 7

Я везде искал, как перемешать / рандомизировать список строк на C # для Windows Phone 7. Я все еще новичок, можно сказать, это, вероятно, выход за рамки моей лиги, но я пишу простое приложение, и это его основа. У меня есть список строк, которые мне нужно перетасовать и вывести в текстовый блок. У меня есть фрагменты кода, которые я искал, но я знаю, что ошибаюсь. Какие-либо предложения?


person Christian    schedule 07.04.2011    source источник
comment
stackoverflow.com/search?q=%5Bc%23%5D+shuffle   -  person dtb    schedule 08.04.2011
comment
Если вам не нужно, чтобы перемешивание было случайным, можно просто вернуть strings.OrderBy (s = ›s.GetHashCode ()); ;)   -  person Morten Mertner    schedule 08.04.2011
comment
возможный дубликат C #: использует Random и OrderBy хорошим алгоритм перемешивания?   -  person Jon    schedule 08.04.2011


Ответы (1)


перемешивание Фишера-Йетса-Дюрстенфельда - это проверенный метод, который легко реализовать. Вот метод расширения, который выполнит перемешивание на месте для любого IList<T>.

(Это должно быть достаточно легко адаптировать, если вы решите оставить исходный список нетронутым и вместо этого вернуть новый перемешанный список или работать с IEnumerable<T> последовательностями, а-ля LINQ.)

var list = new List<string> { "the", "quick", "brown", "fox" };
list.ShuffleInPlace();

// ...

public static class ListExtensions
{
    public static void ShuffleInPlace<T>(this IList<T> source)
    {
        source.ShuffleInPlace(new Random());
    }

    public static void ShuffleInPlace<T>(this IList<T> source, Random rng)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (rng == null) throw new ArgumentNullException("rng");

        for (int i = 0; i < source.Count - 1; i++)
        {
            int j = rng.Next(i, source.Count);

            T temp = source[j];
            source[j] = source[i];
            source[i] = temp;
        }
    }
}
person LukeH    schedule 08.04.2011
comment
Теперь, как бы вы подобрали случайную строку из списка в текстовый блок? - person Christian; 08.04.2011
comment
Если вам нужна только одна случайная строка, возможно, вам вообще не нужно перемешивать список; просто выберите случайную строку из существующего списка: var rng = new Random(); yourTextBlock.Text = yourStringList[rng.Next(yourStringList.Length)]; - person LukeH; 08.04.2011