Dela via


Generiska delegater för att hantera arrayer och listor

Det här avsnittet ger en översikt över generiska delegater för konverteringar, sökpredikat och åtgärder som ska utföras på element i en matris eller samling.

Generiska delegater för att hantera arrayer och listor

Den Action<T> generiska delegeraren representerar en metod som utför en åtgärd på ett element av den angivna typen. Du kan skapa en metod som utför önskad åtgärd på elementet, skapa en instans av ombudet för att representera den Action<T> metoden och sedan skicka matrisen och ombudet till den Array.ForEach statiska generiska metoden. Metoden anropas för varje element i matrisen.

Den List<T> generiska klassen tillhandahåller också en ForEach metod som använder delegeringen Action<T>. Den här metoden är inte allmän.

Anmärkning

Detta framställer en intressant poäng om generiska typer och metoder. Metoden Array.ForEach måste vara statisk (Shared i Visual Basic) och generisk eftersom Array den inte är en allmän typ. Den enda anledningen till att du kan ange en typ för Array.ForEach att arbeta med är att metoden har en egen typparameterlista. Däremot tillhör den icke-generiska List<T>.ForEach metoden den generiska klassen List<T>, så den använder helt enkelt typparametern för sin klass. Klassen är starkt typad, så metoden kan vara en instansmetod.

Det Predicate<T> allmänna ombudet representerar en metod som avgör om ett visst element uppfyller de kriterier som du definierar. Du kan använda den med följande statiska allmänna metoder Array för att söka efter ett element eller en uppsättning element: Exists, Find, FindAll, FindIndex, FindLast, FindLastIndexoch TrueForAll.

Predicate<T> fungerar också med motsvarande icke-generiska instansmetoder för den List<T> generiska klassen.

Med Comparison<T> den generiska delegaten kan du ange en sorteringsordning för matris- eller listelement som inte har någon naturlig sorteringsordning eller åsidosätta den naturliga sorteringsordningen. Skapa en metod som utför jämförelsen, skapa en instans av ombudet Comparison<T> för att representera din metod och skicka sedan matrisen och ombudet till den Array.Sort<T>(T[], Comparison<T>) statiska generiska metoden. Den generiska klassen List<T> tillhandahåller en motsvarande överlagring av en instansmetod, List<T>.Sort(Comparison<T>).

Med den Converter<TInput,TOutput> generiska delegaten kan du definiera en konvertering mellan två typer och konvertera en array av en typ till en array av den andra, eller konvertera en lista av en typ till en lista av den andra. Skapa en metod som konverterar elementen i den befintliga listan till en ny typ, skapa en ombudsinstans som representerar metoden och använd den Array.ConvertAll generiska statiska metoden för att skapa en matris av den nya typen från den ursprungliga matrisen eller den List<T>.ConvertAll<TOutput>(Converter<T,TOutput>) generiska instansmetoden för att skapa en lista med den nya typen från den ursprungliga listan.

Kedjing av delegater

Många av metoderna som använder dessa ombud returnerar en matris eller lista, som kan skickas till en annan metod. Om du till exempel vill välja vissa element i en matris, konvertera dessa element till en ny typ och spara dem i en ny matris, kan du skicka matrisen som returneras av den FindAll generiska metoden till den ConvertAll generiska metoden. Om den nya elementtypen saknar en naturlig sorteringsordning kan du skicka matrisen som returneras av den ConvertAll generiska metoden till den Sort<T>(T[], Comparison<T>) generiska metoden.

Se även