Colocar Resposta 
 
Avaliação do Tópico:
  • 0 votos - 0 Média
  • 1
  • 2
  • 3
  • 4
  • 5
Ajuda a fazer uma procura numa List<> em C#
10-03-2011, 19:22
Mensagem: #1
Ajuda a fazer uma procura numa List<> em C#
Boas pessoal,
Estou a ter dificuldades em fazer uma procura numa List<>.
Eu criei uma pequena struct chamada carro e dai criei uma List de carros.
Código:
struct Carro
{
     public int id;
     public string nome;
     public string matricula;
     public int ano;
     public int estado;
}

List<Carro> listCarros = new List<Carro>();
A minha intenção é poder retirar da lista 1 a 1 os carros, mas conforme o ano, isto é, procurar na lista o carro que é mais recente (se o mais recente for de 2009 e aparecer mais que 1, é retirado o 1o que foi encontrado de 2009) e no final ir apresentando numa label que carro saiu da lista apenas com o propósito de demonstrar que os carros estão a sair da lista pela ordem correcta. Já pesquisei sobre o tema mas só me falam de .Max() e Find() mas não sei como as utilizar no meu caso.

Espero que me possam ajudar a resolver este problema. Muito obrigado pela ajuda desde já.
Cumps
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
10-03-2011, 20:40
Mensagem: #2
RE: Ajuda a fazer uma procura numa List<> em C#
Não trabalho com C#, mas vou te dar +- a ideia de como faria em java.. dado que o c# é um plagio a solução é generalista.

1º recomendar-te-ia que fizesses uma pequena class para o carro.
2º usares uma treemap para a class carro com ordenação pela data de matricula, já que estas ficam automaticamente ordenadas e evitas as procuras.
3º retirar o carro com menor matricula (basicamente é o elemento mais à esquerda da arvore).

Desta forma nao andas a fazer procuras loucas pois inseres os elementos logo ordenados.

cumps

[Imagem: 32545946.gif]
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
10-03-2011, 21:32
Mensagem: #3
RE: Ajuda a fazer uma procura numa List<> em C#
Muito obrigado pela ajuda Guilherme de Sousa mas não sei qual é o equivalente duma TreeMap do Java em C#. Tenho de retirar pelo ano e não pela matricula (sei que não interessa pelo qual preciso de retirar, visto que se conseguir tirar carro a carro pelo ano, será idêntico se quisesse tirar por outro campo). E neste meu caso preciso mesmo de usar uma List<> Neutral. Mais uma vez obrigado.
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
10-03-2011, 21:58
Mensagem: #4
RE: Ajuda a fazer uma procura numa List<> em C#
Então faz simplesmente a inserção na lista dos carros todos, no final quando os quiseres retirar começas por por uma variável x igual ao ano do primeiro carro que sair, e outra para o índice da posição da lista desse mesmo carro. Depois vais percorrendo a lista e comparando a data que tens guardada na variável x com a da posição actual.. se for > (maior ano == carro mais novo), guardas na variável x o ano desse carro e na variável do índice o índice desse mesmo carro. Quando chegares ao fim sabes qual o carro mais novo e removes da lista.. depois é só repetires isto ate a lista se encontrar vazia.. isto é provavelmente o que o docente pretende, no entanto o método mais fácil seria no final da inserção fazeres um sort à lista toda de forma a ficar ordenada e depois é só tirares os elementos do topo da lista.

cumps!

[Imagem: 32545946.gif]
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
10-03-2011, 21:58
Mensagem: #5
RE: Ajuda a fazer uma procura numa List<> em C#
Das duas uma:

- Inseres logo os carros ordenadamente na lista e depois vais apagando de trás para a frente;
- Inseres ao "deus dará" e fazes buscas lineares guardando numa variável a posição do carro a eliminar.

Eu faria a primeira.
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
10-03-2011, 22:12
Mensagem: #6
RE: Ajuda a fazer uma procura numa List<> em C#
Acho que já percebi. Muito Obrigado aos dois pela ajuda. Smile

Cumps
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
13-03-2011, 15:04
Mensagem: #7
RE: Ajuda a fazer uma procura numa List<> em C#
Boas pessoal, para não complicar a criar mais um tópico optei por aproveitar este (espero que não levem a mal o double post) para pedir vos novamente a vossa preciosa ajuda. O problema baseia-se nos dados no inicio do tópico, a minha dúvida é de que maneira fazer um "++" a todos os que estão na lista (o exemplo que meto é aumentar o ano a todos que estão na lista). Eu tentei com estas duas maneiras mas nenhuma das duas funcionou e dão o mesmo erro "Cannot modify members of 'c' because it is a 'foreach iteration variable'"

Código:
foreach(Carro c in listCarros)
{
       c.ano++;
}

-------------------------------------------

for(int i = 0; i<listCarros.Count; i++)
{
        listCarros[i].ano++;
}

Será que me podem ajudar? Obrigado mais uma vez.

Cumps
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
13-03-2011, 15:16
Mensagem: #8
RE: Ajuda a fazer uma procura numa List<> em C#
Troca a struct carro por uma class. Quando se programa por objectos é bom manter o padrão de utilizar so objectos. A forma como uma linguagem orientada a objectos é programada (o seu compilador portanto), baseia o conceito de objecto numa struct, mas com bastantes mais coisas e mais flexível.. e fácil de programar.

cumps

[Imagem: 32545946.gif]
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
13-03-2011, 20:30
Mensagem: #9
RE: Ajuda a fazer uma procura numa List<> em C#
Muito obrigado pela ajuda, fiz como sugeriu e criei a classe Carro mas agora estou com outro problema, não consigo enviar os dados para o vector. No form ao clicar no botao que cria os carros aleatoriamente aparece o erro "A referência de objecto não foi definida como uma instância de um objecto.". O codigo que tenho no botao é este:

Código:
Carro[] vecCarros = new Carro[999];

for (int i = 0; i < int.Parse(NCarros.Text); i++)
{
     vecCarros[i].id=i;
     vecCarros[i].nome=nomeAleatorio();
     vecCarros[i].matricula=matriculaAleatoria();
     vecCarros[i].ano=anoAleatorio();
     vecCarros[i].estado=0;
}

Existe maneira de poder manter o vector fora da classe? Se sim, será que me pode ajudar?

Cumps
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
13-03-2011, 20:49
Mensagem: #10
RE: Ajuda a fazer uma procura numa List<> em C#
Em vez de estares a fazer essa inicialização assim porque não a metes dentro do construtor da class?

cumps

[Imagem: 32545946.gif]
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
Colocar Resposta 


Saltar Fórum:


Utilizadores a ver este tópico: 3 Visitante(s)