Usuário com melhor resposta
Encontrar os maiores valores numa DataTable e retornar em variáveis

Pergunta
-
Bom dia, pessoal!
Bom, estou desenvolvendo uma app em Windows Forms que possui uma DataTable dtValores com 2 colunas: ID e Valor ambas do tipo Int32.
Preciso percorrer a tabela e ler os valores da coluna Valor e encontrar os 5 maiores valores armazenados e atribuir o ID relacionado a 5 variáveis do tipo int: val1, val2, val3, val4 e val5 e deixando-as em ordem crescente.
por exemplo: Suponhamos que na tabela existam os IDs 02, 15, 35, 44 e 52. E que os valores correspondentes sejam 100, 200, 400, 50 e 500. Esses seriam os maiores valores lidos na tabela, então as variáveis teriam os valores:
val1 = 02, val2 = 15, val3 = 35, val4 = 44 e val5 = 52.
Ou seja, vejo os 5 maiores valores e os IDs relacionados a eles são atribuídos às variáveis em ordem crescente.
Alguém tem alguma idéia de como implementar ou ficou confuso o que preciso fazer?
Abraços a todos...
Respostas
-
Olá Fábio.
Agora fique confuso.
Por exemplo, a table que vc fala é um datatable certo.
Eu transformei ela em um dataview.
Code SnippetDataView dv = SuaTable.DefaultView;
Em seguida. Ordenei ela em Ordem Decrescente de Valores(sendo assim, os maiores valores serão os primeiros, e os menores os últimos)
Code Snippetdv.sort = "valor desc";
Se o ser "for" é só para fazer isso, nem precisa dele.
para pegar o id que tem o maior valor. (como está em ordem decrescente de valores, ele é o primeiro)
Code SnippetIDdoValorMaisAlto = dv.item(0).item("id") //Sendo 0 o número da linha(neste caso a primeira, e item o nome da coluna)
Se isso não for o suficiente, seria bom se vc postasse seu problema de forma completa, por exemplo que vc quer fazer com esses resultados.
Espero ter ajudado, e fico no aguardo.
t+
Todas as Respostas
-
Olá Fabio.
Realmente, está bem confuso, eu entendi que vc tem a tabela abaixo:
Code SnippetID VALOR
5 32
7 5
9 6
12 8
3 44
4 33
7 12
Então seu código ficaria assim:
Code Snippetdim Dt as Datatable = PegaSeusValores'Esta função preenche o seu datatable com os valores ou use o seu datatable já preechido.
dim dv as dataview = dt.defaultview
dv.sort = "valor desc"
dim val1, val2, val3, val4, val5 as string
val1 = dv.item(4).item("id").tostring
val2 = dv.item(3).item("id").tostring
val3 = dv.item(2).item("id").tostring
val4 = dv.item(1).item("id").tostring
val5 = dv.item(0).item("id").tostring
Creio que seja isso.
Espero ter ajudado.
t+
-
-
Obirgado pelas respostas.
Bem, ó que ocorre é o seguinte:
Meu programa lê um arquivo de texto e a partir dele cria um DataTable e insere nele os valores lidos. Essa table tem as colunas ID e Valor.
O que preciso fazer agora é percorrer toda a tabela lendo os valores da coluna Valor e encontrar os 5 maiores valores de toda a tabela e obter o ID de cada valor encontrado. A seguir, o ID de cada valor encontrado deverá ser atribuído à 5 variáveis do tipo Int32 e o valor de cada variável deverá ser exibido em ordem crescente. Ufa! Complicado não?
vou exibir o que estou fazendo para ler a tabela:
Code Snippetint val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int val5 = 0;
foreach (DataRow row in tblValores)
{
// Aqui vem a rotina que procura os valores maiores, mas não sei como fazer isso.
// Assim que os 5 valores mais altos forem encontrados, eles devem ser atribuídos
// às variáveis acima, e elas deverão ser exibidas em ordem crescente.
}
Não sei se consegui esclarecer o que preciso, se ficou alguma dúvida, é só perguntar.
Abraços a todos...
-
Olá, Segue:
Code Snippetint val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int val5 = 0;
dataview dv = tblValores.defaultview();
dv.sort = "valor desc";
val1 = dv.item[4].item["id"].tostring
val2 = dv.item[3].item["id"].tostring
val3 = dv.item[2].item["id"].tostring
val4 = dv.item[1].item["id"].tostring
val5 = dv.item[0].item["id"].tostring
foreach (DataRow row in tblValores)
{
// Aqui vem a rotina que procura os valores maiores, mas não sei como fazer isso.
// Assim que os 5 valores mais altos forem encontrados, eles devem ser atribuídos
// às variáveis acima, e elas deverão ser exibidas em ordem crescente.
}
Como não sei se no C# é colchetes mesmo arrisquei colocar rsrssrsr, mas tudo bem, estou pegando os dados de sua Datatable, e jogando em um dataview, em order decrescente de valores, sem seguida pego os 5 primeiros, já que o valor maior vai estar em primeiro.
Espero ter ajudado. t+
-
Obrigado pela ajuda, ricardo.
Sua dica complementou a parte final do código.
O meu problema é exatamente o que está comentado dentro do foreach. É isso o que eu não estou conseguindo fazer: Buscar os maiores valores dentro da Table. Os valores que passei são apenas um exemplo. A Table tem umas 60 linhas, pelo menos...
Mas sua dica foi importante como já citei.
Meu problema ainda continua: Como comparar os valores lidos e saber quais dentre todos eles são os 5 maiores.
Abs a todos...
-
Olá Fábio.
Agora fique confuso.
Por exemplo, a table que vc fala é um datatable certo.
Eu transformei ela em um dataview.
Code SnippetDataView dv = SuaTable.DefaultView;
Em seguida. Ordenei ela em Ordem Decrescente de Valores(sendo assim, os maiores valores serão os primeiros, e os menores os últimos)
Code Snippetdv.sort = "valor desc";
Se o ser "for" é só para fazer isso, nem precisa dele.
para pegar o id que tem o maior valor. (como está em ordem decrescente de valores, ele é o primeiro)
Code SnippetIDdoValorMaisAlto = dv.item(0).item("id") //Sendo 0 o número da linha(neste caso a primeira, e item o nome da coluna)
Se isso não for o suficiente, seria bom se vc postasse seu problema de forma completa, por exemplo que vc quer fazer com esses resultados.
Espero ter ajudado, e fico no aguardo.
t+ -
usa .NET 3.5.... Linq é tao bom...
ao invez de usar um DataTable (bem tmb pode... mas nao vejo mais vantagem em usar um ultimamente) usa um Dictionary e ordena com Linq
algo assim
imaginado q vc tenha um arquivo texto assim (usando o padrao csv):
Code Snippet5;100
1;200
3;500
Code Snippet// Cria uma lista dinamica de inteiros
var lista = new Dicitionary<int, int>()
// Carrega os dados do arquivo na lista
var file = File.OpenRead("arquivo.txt");
while (file.Peek() > 0) {
var linha = file.ReadLine();
var split = linha.Split(';');
lista.Add(int.Parse(split[0], split[1]);
}
var maior = (from item in lista orderby item.Value select item).LastOrDefaut();
bem... na verade o q importa é so essa linha
var maior = (from item in lista orderby item.Value select item).LastOrDefaut();
ela vai ordernar pelo valor (que é o segundo item do dicitionary q se divide em Key e Value) e vai pegar o ultimo registro que é o maior...
Alias... tem o metodo Max no Linq.... mas acho q assim é mais facil
-
Ric4rd0 wrote: Olá Fábio.
Agora fique confuso.
Por exemplo, a table que vc fala é um datatable certo.
Eu transformei ela em um dataview.
Code SnippetDataView dv = SuaTable.DefaultView;
Em seguida. Ordenei ela em Ordem Decrescente de Valores(sendo assim, os maiores valores serão os primeiros, e os menores os últimos)
Code Snippetdv.sort = "valor desc";
Se o ser "for" é só para fazer isso, nem precisa dele.
para pegar o id que tem o maior valor. (como está em ordem decrescente de valores, ele é o primeiro)
Code SnippetIDdoValorMaisAlto = dv.item(0).item("id") //Sendo 0 o número da linha(neste caso a primeira, e item o nome da coluna)
Se isso não for o suficiente, seria bom se vc postasse seu problema de forma completa, por exemplo que vc quer fazer com esses resultados.
Espero ter ajudado, e fico no aguardo.
t+Agora entendi o q vc quis dizer! Como o foreach ainda estava no seu exemplo, achei q ainda teria que terminá-lo.
Mas, blz! Vou utilizar assim.
Rui, obrigado pelo exemplo, ma no meu caso estou usando o .Net 2.0.
Abraços a todos.