Forum Pplware

Versão Completa: Ajuda a fazer uma procura numa List<> em C#
Está de momento a ver uma versão reduzida do nosso conteúdo. Ver versão completa com o formato adequado.
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
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
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.
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!
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.
Acho que já percebi. Muito Obrigado aos dois pela ajuda. Smile

Cumps
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
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
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
Em vez de estares a fazer essa inicialização assim porque não a metes dentro do construtor da class?

cumps
URL's de Referência