Inquiridor
Adicionar elementos a uma lista(of integer/decimal)

Pergunta
-
Olá Pessoal!
Com a tabela abaixo, estou querendo somar os valores para cada fornecedor:
idFornecedor Item Preco
1 Item a 10,00
1 Item b 20,00
2 Item a 30,00
2 Item b 40,00
Assim, o resultado desejado seria: (1, 30) e (2, 70)
Para tanto, estou querendo montar duas listas: uma para o fornecedor, outra para o somatorio. Depois, converteria as listas em arrays e usaria o array.sort para ordena-las, tendo como chave o somatorio. Porém, quando eu uso o código abaixo, não consigo adicionar os elementos às listas:
Private Sub Calculo() Dim idFornecedor As List(Of Integer) = New List(Of Integer) Dim somaFornecedor As List(Of Decimal) = New List(Of Decimal) Dim valor As Decimal For i = 1 To j For Each col As DataGridViewRow In dgItensPesquisado.Rows If col.Cells(0).Value = i Then valor = valor + CInt(col.Cells(2).Value) somaFornecedor.Add(valor) idFornecedor.Add(i) End If Next Next i End Sub
O quê estou fazendo de errado? As mensagens de erro são:
- para o idFornecedor, o erro é que se adiciona somente o primeiro elemento, e não os demais do laço, que no exemplo seria o "2".
- para o somaFornecedor o erro é que o indice esta fora do range;isto é, o valor de 30 para o primeiro i não pode ser adicionado
Qualquer ajuda eu agradeceria!
goku
Todas as Respostas
-
amigo montei um exemplo para você:
Dim Soma As Double Dim Id As Integer Dim idFornecedor As New List(Of Integer)() Dim somaValores As New List(Of Double)() For i As Integer = 0 To Dgv.Rows.Count - 1 Id = Convert.ToInt32(Dgv.Rows(i).Cells(0).Value) 'evita calcular repetido If Not idFornecedor.Contains(Id) Then Soma = 0.0 For n As Integer = 0 To Dgv.Rows.Count - 1 If Convert.ToInt32(Dgv.Rows(i).Cells(0).Value) = Id Then Soma += Convert.ToDouble(Dgv.Rows(i).Cells(1).Value) End If Next idFornecedor.Add(Id) somaValores.Add(Soma) End If Next
ve ai e me fala se deu certo !
abraços,
boa noite !
Att, Afonso Fernandes.
-
Olá! Obrigado pelo post! Eu tentei chamar o resultado, mas não retornou nada, nem mensagem de erro. Alterei o código, incluindo next n e next i e alterando o endereço da celula na Soma, conforme abaixo:
Dim Soma As Double Dim Id As Integer Dim idFornecedor As New List(Of Integer)() Dim somaValores As New List(Of Double)() For i As Integer = 0 To dgItensPesquisado.Rows.Count - 1 Id = Convert.ToInt32(dgItensPesquisado.Rows(i).Cells(0).Value) 'evita calcular repetido If Not idFornecedor.Contains(Id) Then Soma = 0.0 For n As Integer = 0 To dgItensPesquisado.Rows.Count - 1 If Convert.ToInt32(dgItensPesquisado.Rows(i).Cells(0).Value) = Id Then Soma += Convert.ToDouble(dgItensPesquisado.Rows(i).Cells(2).Value) End If Next n idFornecedor.Add(Id) somaValores.Add(Soma) End If Next i Dim idFornecedorArray() = idFornecedor.ToArray() Dim somaValoresArray() = somaValores.ToArray() 'Console.WriteLine(idFornecedor) Console.ReadLine() End Sub
Obrigado!
goku
-
-
Olá, tentei converter para Array e utilizar o Array.Sort, mas consegui resultados estranhos. O resultado varia...
Private Sub calculo()
Dim Soma As Double
Dim Id As Integer
Dim idFornecedor As List(Of Integer) = New List(Of Integer)
Dim somaValores As List(Of Double) = New List(Of Double)For i As Integer = 1 To dgItensPesquisado.Rows.Count - 1
Id = Convert.ToInt32(dgItensPesquisado.Rows(i).Cells(0).Value)'evita calcular repetido
If Not idFornecedor.Contains(Id) Then
Soma = 0.0For n As Integer = 1 To dgItensPesquisado.Rows.Count - 1
If Convert.ToInt32(dgItensPesquisado.Rows(i).Cells(0).Value) = Id Then
Soma += Convert.ToDouble(dgItensPesquisado.Rows(i).Cells(2).Value)
End If
Next nidFornecedor.Add(Id)
somaValores.Add(Soma)
End If
Next i
Dim idFornecedorArray() = idFornecedor.ToArray()
Dim somaValoresArray() = somaValores.ToArray()
Array.Sort(somaValoresArray, idFornecedorArray)
For Each element In somaValoresArray
For Each elements In idFornecedorArray
MsgBox(element.ToString - elements.ToString)
Next
Next
End Subgoku
-
-
Ah! Desculpe, foi porque montei errado a mensagem! Deveria ser assim:
MsgBox(element.ToString & " - " & elements.ToString)
Entretanto, vejo que os resultados não estão legais. Pelo exemplo, eu desejaria como resultado os conjuntos: (1, 30) e (2, 70).
Mas, o Array de soma está com o conjunto (0, 40, 120) e o array de ID está com o conjunto (0, 1, 2). Bom, o "0" está aparecendo pois o meu datagrid retorna uma linha Null (sem dados). Porém o erro está no array de soma...
Então, fiz umas modificações e está funcionando beleza, conforme abaixo:
Dim idFornecedor As List(Of Integer) = New List(Of Integer) Dim somaFornecedor As List(Of Decimal) = New List(Of Decimal) Dim valor As Decimal For i = 1 To j valor = 0 For Each col As DataGridViewRow In dgItensPesquisado.Rows If col.Cells(0).Value = i Then valor = valor + CDec(col.Cells(2).Value) End If Next somaFornecedor.Add(valor) idFornecedor.Add(i) Next i Dim idFornecedorArray() = idFornecedor.ToArray() Dim somaValoresArray() = somaFornecedor.ToArray() Array.Sort(somaValoresArray, idFornecedorArray) ' ''Console.WriteLine("After sorting a section of the Array using the default comparer:") ' ''PrintKeysAndValues(somaValoresArray, idFornecedorArray) For Each element In somaValoresArray For Each elements In idFornecedorArray MsgBox(element.ToString & " - " & elements.ToString) Next Next
Eu gostaria de perguntar se há uma forma de fazer o Loop pelos conjuntos, e trazer ao mesmo tempo o idFornecedor e a soma a ele associada, pois da forma do exemplo acima, sempre trago as somas, e mais todos os IDs, sem haver uma associação entre eles, tipo: (30, 1), (30, 2), (70, 1), (70, 2). Alguma dica?
goku