none
Parando um foreach RRS feed

  • Pergunta

  • Olá, a seguir tenho uma função própria, feita com classes etc próprios, então não acredito que alguém irá intender o que ela faz, porém gostaria de saber como faço para quebrar o foreach do inicio da função após uma certa linha do bloco de comando, a função é a seguinte:

     

    if (dataGridTargeting.Rows.Count > -1)
                {
                  if (P.RedSquare < 1)
                  {
                    for (int i = 0; i < dataGridTargeting.Rows.Count; i++)
                    {
                    foreach (Tibia.Objects.Creature creature in C.BattleList.GetCreatures())
                    {
     
                        if (creature.Name == dataGridTargeting.Rows[i].Cells[0].Value.ToString() && creature.IsReachable() && (creature.DistanceTo(P.Location) < 8)))
                        {
                          if (P.RedSquare < 1)
                          {
                            creature.Attack();
                            Thread.Sleep(100);
                            CreaturePosition();
                            if (checkBoxLooting.Checked)
                            {
                              while (creature.HPBar > 0 && P.TargetId > 0)
                              {
                                Thread.Sleep(50);
                              }
                              if (creature.HPBar == 0)
                              {
                                OpenBodyLocation(X, Y, Z);
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
    

    Bom, o que preciso fazer, é quebrar o loop foreach após o comando:

    creature.Attack();

    Porém eu quero continuar executando os comandos que vem a seguir:

    Thread.Sleep(100);

    CreaturePosition();

    etc

    Até o fim, há alguma maneira de fazer isso?

    Obrigado.

     

    sexta-feira, 15 de outubro de 2010 12:58

Respostas

  • Olá,

    O comando "break" quebra o laço do foreach():

    foreach (Tibia.Objects.Creature creature in C.BattleList.GetCreatures())
    {
       /// comandos
       if(condicao)
       {
           break;
       }
       // mais comandos
    }

    []s,


    Carlos dos Santos
    blog: www.carloscds.net 
    twitter: @cdssoftware

    sexta-feira, 15 de outubro de 2010 13:25
  • O break finaliza o for ou foreach onde ele estiver. Quanto a parar depois de um determinado tempo, basta criar uma variável e ir incrementando, quando atingir o ponto, chama o break. Veja:

    int contador = 0;
    for(int i=0;i<1000;i++)
    {
       foreach(string e in lista)
       {
           contador++;
           if(contador > 100)
           {
                  contador = 0;
                  break;
            }
        }
        // continua aqui
    }

    []s,


    Carlos dos Santos
    blog: www.carloscds.net 
    twitter: @cdssoftware

    sábado, 16 de outubro de 2010 23:02

Todas as Respostas

  • Você quer dizer se ele entrar neste if, faça as coisas dentro dele só uma vez.

     

    if (P.RedSquare < 1)
    {
        creature.Attack();
        Thread.Sleep(100);
        CreaturePosition();
        if (checkBoxLooting.Checked)
        {
            while (creature.HPBar > 0 && P.TargetId > 0)
          {
            Thread.Sleep(50);
          }
          if (creature.HPBar == 0)
          {
              OpenBodyLocation(X, Y, Z);
          }
        }
        // Adicione um continue aqui.
        continue;
    }
    

     


    Coragem não é ausência de medo e sim o controle dele. Cursando Tecnologia em Análise e Desenvolvimento de Sistemas - Unopar
    sexta-feira, 15 de outubro de 2010 13:13
  • Olá,

    O comando "break" quebra o laço do foreach():

    foreach (Tibia.Objects.Creature creature in C.BattleList.GetCreatures())
    {
       /// comandos
       if(condicao)
       {
           break;
       }
       // mais comandos
    }

    []s,


    Carlos dos Santos
    blog: www.carloscds.net 
    twitter: @cdssoftware

    sexta-feira, 15 de outubro de 2010 13:25
  • Obrigado pelas respostas. Na realidade estou tendo problemas com essa função somente em alguns computadores. No meu por exemplo, ele entra nos laços, executa as funções, checa a condicao IF, executa a ultima funcao e finaliza. Porém em alguns computadores a função creature.Attack() e afins é executada de acordo com a quantidade de creatures no C.Battlelist. Por exemplo, se tenho 3 criaturas o foreach pega as 3, checa o primeiro if e executa o creature.Attack, porém ao invéz de ele continuar com as funcoes seguintes ele volta no foreach, sendo assim o meu programa ataca todas as criaturas que estão na tela dentro do laço. Se tenho 3 criaturas ele vai atacar 1 e em seguida atacar a segunda e na terceira ele fixa o .Attack() O que acho estranho é que isso só acontece em alguns computadores e não sei o porque, mesmo porque a sintax da função em si não deixaria o programa fazer tal ação(atacar todos) Espero que tenha ficado mais claro e testarei as respostas a cima assim que possivel. Obrigado novamente.
    sexta-feira, 15 de outubro de 2010 15:57
  • Olá a todos novamente.

    Bom, infelizmente o comando break ainda não resolveu meu problema, como disse, esse problema acontece em alguns computadores não em todos(muito estranho isso)

    Será que se eu fizer algo como:

    if (dataGridTargeting.Rows.Count > -1)
          {
           if (P.RedSquare < 1)
           {
            for (int i = 0; i < dataGridTargeting.Rows.Count; i++)
            {
            foreach (Tibia.Objects.Creature creature in C.BattleList.GetCreatures())
            {
     
              if (creature.Name == dataGridTargeting.Rows[i].Cells[0].Value.ToString() && creature.IsReachable() && (creature.DistanceTo(P.Location) < 8)))
              {
               if (P.RedSquare < 1)
               {
                creature.Attack();
                Thread.Sleep(100);
    break;
    }
    }
    }
    }
                CreaturePosition();
                if (checkBoxLooting.Checked)
                {
                 while (creature.HPBar > 0 && P.TargetId > 0)
                 {
                  Thread.Sleep(50);
                 }
                 if (creature.HPBar == 0)
                 {
                  OpenBodyLocation(X, Y, Z);
                 }
    }
    }
    }
    

    Assim ele executaria aqueles comandos após sair do break certo?

    Não estou em casa para testar, por isso estou perguntando e não testando xD

    Qualquer luz a mais ajuda, assim que possivel testarei o que disse.

    Abraços.

    sábado, 16 de outubro de 2010 14:16
  • Olá,

    O break cancela o foreach() e o fluxo continua após ele. Se quiser parar tudo após o foreach() terá que criar uma variável de controle, tipo bool e setá-la antes do break, para novamente verificá-la após o fim do foreach().

    []s,


    Carlos dos Santos
    blog: www.carloscds.net 
    twitter: @cdssoftware

    sábado, 16 de outubro de 2010 16:41
  • Da maneira que eu pensei a cima não deu certo, pois ele fica executando aquela Função direto quando ativo um checkBox.

     

    E o break para o loop do for antes do foreach, eu acho que não tem como, MAS, tem alguma maneira de setar o break para X loop? Tipo, dar um break no foreach mas continuar dentro do For ?

    sábado, 16 de outubro de 2010 22:01
  • O break finaliza o for ou foreach onde ele estiver. Quanto a parar depois de um determinado tempo, basta criar uma variável e ir incrementando, quando atingir o ponto, chama o break. Veja:

    int contador = 0;
    for(int i=0;i<1000;i++)
    {
       foreach(string e in lista)
       {
           contador++;
           if(contador > 100)
           {
                  contador = 0;
                  break;
            }
        }
        // continua aqui
    }

    []s,


    Carlos dos Santos
    blog: www.carloscds.net 
    twitter: @cdssoftware

    sábado, 16 de outubro de 2010 23:02