EMBARALHAR ITENS

JABA 14/06/2012 17:05:04
#404181
Olá pessoal, Boa Tarde!

Gostaria de embaralhar uma lista pelo indice dos itens. Alguem poderia me ajudar nessa?

ex: dim baralho as new list(of carta)
baralho.embaralhar()

vlw
KERPLUNK 14/06/2012 17:25:45
#404184
Resposta escolhida
Quais as propriedades do objeto [Ô]carta[Ô]?
JABA 14/06/2012 17:30:40
#404185
KerpLunk, nesse caso eu acho que nem precisa saber quais são as propriedades do obj carta, pois eu quero embaralhar as cartas pelo indice que ele está inserido na lista não pelo conteúdo das propriedades, mas vou te passar mesmo assim. As propriedades do obj carta são: Nipe e Valor.

Agradeço pela atenção.

vlw
KERPLUNK 14/06/2012 17:59:32
#404189
Baseado no algorítmo de Fisher-Yates:

<System.Runtime.CompilerServices.Extension> _
Public Shared Sub Embaralhar(Of T)(list As IList(Of T))
Dim rng As New Random()
Dim n As Integer = list.Count
While n > 1
n -= 1
Dim k As Integer = rng.[Next](n + 1)
Dim value As T = list(k)
list(k) = list(n)
list(n) = value
End While
End Sub
Para usar:
Dim cartas As List(Of Carta) = Getcartas() [ô]ou qualquer outra coisa que preencha a lista de cartas
cartas .Embaralhar()

Tenha em mente que isto é um método de extensão.
JABA 14/06/2012 18:26:45
#404192
Vou testar quando chegar em casa. Pelo que analisei aqui, parece perfeito. Porém, Já que se trata de um método de extensão, vou ter que colocar isso dentro de um módulo, não é isso?

Eu tinha feito algo parecido e minha intenção era mesmo saber se já existia um codigo nativo do .net para isso. No java acho que existe o metodo chamado Shuffle que faz isso. No .net eu não achei essa implementação. Pelo visto, não deve existir mesmo não. Eu até tentei fazer essa parte implementando a interface IComparer, mas ele só ordena pela propriedade atribuida e não embaralha pelo indice dos itens.

Kerplunk, Muito obrigado pela ajuda.
vlw
KERPLUNK 15/06/2012 09:43:06
#404222
Citação:

Já que se trata de um método de extensão, vou ter que colocar isso dentro de um módulo, não é isso?


Não. Coloque dentro de uma classe e inclua a diretiva(Imports Namespace.NomeClasse) dessa classe onde quer que você queira usar esse método.

Tópico encerrado , respostas não são mais permitidas