Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128

    [C#] Metodo FindAll su liste

    salve a tutti.. ho cercato di capire dal msdn come usare questo metodo.. ma sinceramente sono un pò in alto mare.. cercando qua e là su google sono arrivato ad altri esempi che introducevano l'uso della parola chiave "delegate"..
    potreste gentilmente, darmi un'esempio e spiegarmi come usare il metodo FindAll?
    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    432
    Beh l'esempio su msdn mi sembra abbastanza chiaro a dirti la verità. Praticamente ti devi scrivere una funzione di callback che prende in input una variabile del tipo della lista e nel caso quest'ultima corrisponde alle condizione di ricerca ritorna true altrimenti false.
    Ti ho scritto un esempietto per mostrarti come funziona, inolte mi sono permesso di farti un paragone tra altri modi di cercare all'interno di una lista. L'uso di lamba expression è secondo me quello più elegante in questo caso.

    codice:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace ProvaFindAll
    {
    	class MainClass
    	{
    		public static void Main (string[] args)
    		{
    			List<int> listaInteri = new List<int>();
    			int i;
    			
    			for(i = 0; i < 100; i++)
    			{
    				listaInteri.Add(i);
    			}
    			
    			//Utilizzo di lamba expression
    			var listaMag10 = listaInteri.FindAll( num => num>10 );
    			StampaLista(listaMag10);
    			
    			//Utilizzo di delegati
    			var listaPari = listaInteri.FindAll( NumPari);
    			StampaLista(listaPari);
    			
    			//LINQ
    			var listaDispari = (from num in listaInteri
    							where num % 2 != 0
    							select num).ToList<int>();
    			StampaLista(listaDispari);
    
    		}
    		
    		static void StampaLista(List<int> lista)
    		{
    			foreach(int n in lista)
    			{
    				Console.WriteLine(n);
    			}
    		}
    		
    		static bool NumPari(int n)
    		{
    			if(n % 2 ==0)
    				return true;
    			return false;
    		}
    	}
    }

  3. #3
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,000
    Ormai credo sia più efficente e facile usare LINQ.

  4. #4
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128
    Capito ragazzi.. grazie

  5. #5
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128
    Però non riesco a comprendere una cosa.. io ho una struttura in lista.. la seguente:
    codice:
      public struct Rubrica     
    {         
    string sNome;         
    string sCognome;         
    string sNumero;
    ...
    con relativa proprietà e costruttore!!

    Il mio problema nasce nel momento in cui voglio cercare nella lista con i delegati, ad esempio, per numero di telefono!!
    Ho capito che una chiamata del genere:
    codice:
    rRubrica = lRubrica.FindAll(Confronta);
    dove rRubrica è una lista di appoggio, passa automaticamente al metodo Confronta la lista stessa come parametro.. in maniera tale che poi nella mia funzioncina posso mettere qualcosa del genere:
    codice:
    static bool Confronta(Rubrica lista)     
    {         
    if ((string.Compare(num,lista.Numero))==0)             
    return true;         
    else             
    return false;      
    }
    il problema è proprio qui: non so come passare "num" alla funzione.. ho provato ad inserire nella chiamata .FindAll(Confronta(lRubrica,num)) e a modificare di conseguenza la funzione, ma ho ricevuto un'errore nel passaggio dei parametri!!
    Il mio obbiettivo è quello di cercare in tutta la lista le persone con un dato numero di telefono!
    GRAZIE

  6. #6
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    432
    Io sinceramente userei la soluzione linq, che secondo me sarebbe la più elegante.
    Comunque prova una cosa del genere:

    codice:
    String numero = "132465";
    
    rRubrica = lRubrica.FindAll(delegate (Rubrica item)
    {
        return item.Numero.Equals(numero);
    });
    Ciao ciao

  7. #7
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128
    non ho ben capito la soluzione LINQ per questo cercavo di capire come sfruttare i delegate.. quindi è necessaria la parola chiave delegate prima della chiamata a "Rubrica" ?

  8. #8
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128
    Ho fatto tutto grazie a r1cky con
    codice:
    rRubrica = lRubrica.FindAll(delegate (Rubrica oggetto)
    { return oggetto.Numero.Equals(num);});
    grazie mille

    però vorrei approfondire il linq.. nel mio caso come potrei implementarlo?

  9. #9
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    432
    codice:
    var rRubrica = (from c in lRubrica
                         where c.Numero.Equals(numero)
                         select num).ToList<Rubrica>();

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.