none
Como varrer uma lista ou Array de modo que todos os seu elementos sejam mostrados de forma aleatória? RRS feed

  • Pergunta

  • Amigos, boa tarde. Criei uma aplicação Windows Form que mostra imagens de uma pasta de maneira aleatória, por meio de um objeto Random. São 50 imagens, é gerado um número inteiro de 1 a 50 e com ele eu monto uma string que faz com que o programa ache a imagem (img1.jpg, img2.jpg... img50.jpg). Se o novo número que é escolhido é igual ao anterior, por meio de um While é feita outra escolha até que o novo número seja diferente do anterior, então, a nova imagem nunca é igual à anterior, mas não sei porque, o computador tem preferencia por alguns números e algumas imagens aparecem muitas vezes e outras nunca. Como então eu poderia varrer uma lista, de forma aleatória, de modo que, antes de exibir as 50 imagens, elas nunca se repetissem? Claro, depois de exibidas as 50 imagens, o processo teria que se repetir.

    Para facilitar a vida, eu exibo as imagens num picturebox do form1, mas elas são escolhidas por uma classe EscolherImagem que criei e as informações encontradas ficam salvas em uma classe Util que guarda elas em atributos estáticos, ou seja, quando eu preciso escolher uma nova imagem, eu vou na útil e vejo qual a última escolha, então, eu teria que colocar a lista das "já escolhidas" de forma estática na classe Util.

    Desde já agradeço a atenção.

    sábado, 13 de fevereiro de 2016 19:56

Respostas

  • Você poderia popular uma lista com os 50 itens reutilizando sua lógica  (img1.jpg, img2.jpg... img50.jpg) e depois utilizar o código do exemplo abaixo para ordenar randomicamente a lista, pegar o primeiro item e depois removê-lo da lista.

    //Ordena randomicamente a lista uilizando o Guid.NewGuid() e depois pega o primeiro item.
    var item = lista.OrderBy(o => Guid.NewGuid()).FirstOrDefault();
    
    //Se item for null é pq a lista está vazia
    if (item != null)
    {
        //faz o que precisar com o item aqui
    
        //Remove o item da lista
        lista.Remove(item);
    }
    else
    {
        //Lista vazia
    }

    • Marcado como Resposta Marcos SJ segunda-feira, 15 de fevereiro de 2016 11:06
    sábado, 13 de fevereiro de 2016 21:48
  • Sim, você pode armazenar ela como uma lista (propriedade) estática dentro da classe, pode consultar pelo método estático...

    Na dúvida utilize o debug do Visual Studio para verificar se os dados estão sendo armazenados corretamente e também se estão sendo removidos e reordenados adequadamente.

    • Marcado como Resposta Marcos SJ segunda-feira, 15 de fevereiro de 2016 11:06
    sábado, 13 de fevereiro de 2016 23:04

Todas as Respostas

  • Você poderia popular uma lista com os 50 itens reutilizando sua lógica  (img1.jpg, img2.jpg... img50.jpg) e depois utilizar o código do exemplo abaixo para ordenar randomicamente a lista, pegar o primeiro item e depois removê-lo da lista.

    //Ordena randomicamente a lista uilizando o Guid.NewGuid() e depois pega o primeiro item.
    var item = lista.OrderBy(o => Guid.NewGuid()).FirstOrDefault();
    
    //Se item for null é pq a lista está vazia
    if (item != null)
    {
        //faz o que precisar com o item aqui
    
        //Remove o item da lista
        lista.Remove(item);
    }
    else
    {
        //Lista vazia
    }

    • Marcado como Resposta Marcos SJ segunda-feira, 15 de fevereiro de 2016 11:06
    sábado, 13 de fevereiro de 2016 21:48
  • Entendi, crio uma lista com todos os ítens e a cada utilização, removo o ítem escolhido, de modo que na próxima varredura o ítem usado não possa aparecer, legal, acho que pode dar certo sim, obrigado! Mas essa lista poderia ser usada como um método / atributo estático, de modo que possa armazenar a informação com segurança? 
    sábado, 13 de fevereiro de 2016 22:54
  • Sim, você pode armazenar ela como uma lista (propriedade) estática dentro da classe, pode consultar pelo método estático...

    Na dúvida utilize o debug do Visual Studio para verificar se os dados estão sendo armazenados corretamente e também se estão sendo removidos e reordenados adequadamente.

    • Marcado como Resposta Marcos SJ segunda-feira, 15 de fevereiro de 2016 11:06
    sábado, 13 de fevereiro de 2016 23:04