none
Encontrar os maiores valores numa DataTable e retornar em variáveis RRS feed

  • 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...

    sexta-feira, 12 de dezembro de 2008 10:08

Respostas

  • Olá Fábio.
    Agora fique confuso.

    Por exemplo, a table que vc fala é um datatable certo.

    Eu transformei ela em um dataview.
    Code Snippet

    DataView 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 Snippet

    dv.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 Snippet

    IDdoValorMaisAlto = 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+
    sábado, 13 de dezembro de 2008 00:22

Todas as Respostas

  • Olá Fabio.

    Realmente, está bem confuso, eu entendi que vc tem a tabela abaixo:

    Code Snippet
    ID   VALOR
    5    32
    7    5
    9    6
    12   8
    3    44
    4    33
    7    12

     

     


    Então seu código ficaria assim:

    Code Snippet

    dim 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+

    sexta-feira, 12 de dezembro de 2008 11:13
  • Fabio, se esta tabela for um banco de dados, você pode via ddl selecionar os cinco primeiros que atendam a qualquer critério especificado.

     

    Qual banco você esta usando?

    sexta-feira, 12 de dezembro de 2008 12:21
  • 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 Snippet

    int 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...

     

    sexta-feira, 12 de dezembro de 2008 14:39
  • Olá, Segue:

    Code Snippet

     

    int 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+

     

     

    sexta-feira, 12 de dezembro de 2008 15:25
  • 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...

    sexta-feira, 12 de dezembro de 2008 19:36
  • Olá Fábio.
    Agora fique confuso.

    Por exemplo, a table que vc fala é um datatable certo.

    Eu transformei ela em um dataview.
    Code Snippet

    DataView 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 Snippet

    dv.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 Snippet

    IDdoValorMaisAlto = 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+
    sábado, 13 de dezembro de 2008 00:22
  •  

    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 Snippet

    5;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

    sábado, 13 de dezembro de 2008 06:01
    Moderador
  •  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 Snippet

    DataView 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 Snippet

    dv.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 Snippet

    IDdoValorMaisAlto = 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.

    segunda-feira, 15 de dezembro de 2008 10:15