[vb.net] Array.IndexOF - Retornar todos os índices do mesmo valor

0 respostas
dmandrak

Pessoal, segue o probleminha para aquecer o feriado de vcs (só o de vcs, pq eu tô trabalhando né :cry: …)

Eu tenho 3 vetores, um deles com 40 elementos (meio que agrupados 5-a-5) e os outros com NO MÁXIMO 8, isso porque eles são criados a partir de 2 itens de cada grupo de 5 do vetor de 40.

Apenas para exemplificar eu darei nomes aos bois:
Vetor de 40:

TagsRSLinx(0) = AUX_FLAG_TROCA_TURNO TagsRSLinx(1) = CODMAT_PD1 TagsRSLinx(2) = QUANT_ATUAL_PD1 TagsRSLinx(3) = TOTAL_PD1 TagsRSLinx(4) = UMIDADE_PD1 TagsRSLinx(5) = CODMAT_PD2 TagsRSLinx(6) = QUANT_ATUAL_PD2 TagsRSLinx(7) = TOTAL_PD2 TagsRSLinx(8) = UMIDADE_PD2 TagsRSLinx(9) = CODMAT_PD3 TagsRSLinx(10) = QUANT_ATUAL_PD3 TagsRSLinx(11) = TOTAL_PD3 TagsRSLinx(12) = UMIDADE_PD3 TagsRSLinx(13) = CODMAT_PD4 TagsRSLinx(14) = QUANT_ATUAL_PD4 TagsRSLinx(15) = TOTAL_PD4 TagsRSLinx(16) = UMIDADE_PD4 TagsRSLinx(17) = CODMAT_PD5 TagsRSLinx(18) = QUANT_ATUAL_PD5 TagsRSLinx(19) = TOTAL_PD5 TagsRSLinx(20) = UMIDADE_PD5 TagsRSLinx(21) = CODMAT_PD6 TagsRSLinx(22) = QUANT_ATUAL_PD6 TagsRSLinx(23) = TOTAL_PD6 TagsRSLinx(24) = UMIDADE_PD6 TagsRSLinx(25) = CODMAT_PD7 TagsRSLinx(26) = QUANT_ATUAL_PD7 TagsRSLinx(27) = TOTAL_PD7 TagsRSLinx(28) = UMIDADE_PD7 TagsRSLinx(29) = CODMAT_PD8 TagsRSLinx(30) = QUANT_ATUAL_PD8 TagsRSLinx(31) = TOTAL_PD8 TagsRSLinx(32) = UMIDADE_PD8 TagsRSLinx(33) = QUANT_PROGR_PD1 TagsRSLinx(34) = QUANT_PROGR_PD2 TagsRSLinx(35) = QUANT_PROGR_PD3 TagsRSLinx(36) = QUANT_PROGR_PD4 TagsRSLinx(37) = QUANT_PROGR_PD5 TagsRSLinx(38) = QUANT_PROGR_PD6 TagsRSLinx(39) = QUANT_PROGR_PD7 TagsRSLinx(40) = QUANT_PROGR_PD8

Os outros dois vetores são

Dim materiais() As String 'Guarda os tipos de materiais nos PD
Dim quantidadeMaterial() As Single 'Guarda a quantidade para cada material

Ou seja, eles podem ter de 1-8 elementos, dependendo dos elementos 1(i5) e 2 (i5+1) do vetorzão, se são repetidos ou não.

Para encher os dois menores eu faço:

For i = 1 To 8
            'Primeira passagem, obrigatoriamente o material é novo na lista
            If i = 1 Then
                materiais(i) = (ValorTagsRSLinx(IndiceTag(TagsRSLinx, CODMAT_PD1) + 1))
                quantidadeMaterial(i) = CSng((ValorTagsRSLinx(IndiceTag(TagsRSLinx, QUANT_ATUAL_PD1) + 1)).ToString("000.00").Replace(".", ","))
                j = 5
            Else
                'Testa se tem um material com o mesmo nome no vetor
                aux = IndiceTag(materiais, (ValorTagsRSLinx(IndiceTag(TagsRSLinx, j + 1))))
                If aux = -1 Then
                    'Adiciona novo material e quantidade 
                    materiais(i) = CInt(ValorTagsRSLinx(j + 1)).ToString("00000")
                    quantidadeMaterial(i) = CSng((ValorTagsRSLinx(j + 1)).ToString("000.00").Replace(".", ","))
                Else
                    'Aumenta a quantidade do material selecionado
                    quantidadeMaterial(aux + 1) += CSng((ValorTagsRSLinx(j + 1)).ToString("000.00").Replace(".", ","))
                End If
                j += 4
            End If
        Next

E a função IndiceTag só faz um Array.IndexOf(Vetor(), Object). Mas depois, eu tenho que atualizar os valores do vetor de 40 de acordo com uns cálculos, então, se eu tiver 3 materiais iguais, eu tenho que receber 3 Index nessa chamada:

'Calcula o percentual de cada material no vetor materiais() 
        j = 2
        For i = 1 To materiais.GetLength(0)
            ValorTagsRSLinx(IndiceTag(TagsRSLinx, materiais(i)) + 1) = quantidadeMaterial(i) / totalQuantidade
        Next

Como estou meio bloqueado das idéias hoje e acho que tem alguns outros azarados como eu que estão trabalhando e vão entrar no GUJ, eu estou postando a dúvida.

Ajuda é sempre bem vinda!
Se não deu pra entender, diga o que está nebuloso que eu esclareço!!!

Criado 20 de abril de 2009
Respostas 0
Participantes 1