Le Interfacce in C# per Creare Nuove Strutture Dati

Sebbene le strutture dati presenti nel framework .NET siano in grado di soddisfare i requisiti dei programmi in C#, si potrebbero però voler creare delle strutture dati personalizzate. Il framework .NET per questo motivo mette a disposizione delle comode interfacce che una volta implementate in una propria classe, permettono di utilizzare quest’ultima come una struttura dati standard. Un’interfaccia importante è IList che è implementata dalle classi che abbiamo visto nelle scorse lezioni e che è definita da queste proprietà:

  • IsFixedSize – indica se la lista è a dimensione fissa
  • IsReadOnly – indica se la lista è modificabile
  • Item – ritorna o imposta il valore di un elemento

i metodi previsti sono invece i seguenti:

  • Add() – aggiunge un elemento
  • Clear() – rimuove tutti gli elementi
  • Contains() – ritorna true se l’oggetto passato come parametro è presente nella lista
  • IndexOf() – ritorna l’indice di un elemento nella lista
  • Insert() – inserisce un oggetto nella lista in una posizione specificata
  • Remove() – rimuove un oggetto dalla lista
  • RemoveAt() – rimuove l’oggetto presente a uno specifico indice

L’interfaccia IEnumerable definisce invece il solo metodo GetEnumerator(). Nelle strutture dati è utilizzata anche un’altra interfaccia, ICollection, che è una sottointerfaccia di IEnumerable e che definisce in più le proprietà Count, IsSyncronized, SyncRoot ed il metodo CopyTo(). IDictionary è una sottointerfaccia di ICollection ed IEnumerable che definisce strutture dati che associano ad un valore una chiave, come nel caso delle HashTable. In particolare IDictionary, in aggiunta alle proprietà ereditate ne definisce altre:

  • Keys – ritorna una ICollection che contiene le chiavi della collezione
  • Values – ritorna una ICollection che contiene gli elementi della collezione

i metodi definiti sono invece:

  • Add() – aggiunge un oggetto collegato ad una chiave
  • Clear() – rimuove tutti gli elementi nel dizionario
  • Contains() – indica se un oggetto è presente o meno nel dizionario, data la sua chiave
  • GetEnumerator() – ritorna un enumeratore di tipo IDictionaryEnumerator
  • Remove() – rimuove un elemento dal dizionario, data la sua chiave

Il framework .NET agevola la creazione di nuove strutture dati, offrendo la classe CollectionBase, che fornisce una implementazione di base ed astratta di una struttura dati tipizzata, formata cioè da dati a grandezza fissa e non generici, come abbiamo visto finora.
Terminiamo questa lezione, forzatamente teorica, parlando degli iteratori. Lo scorrimento di elementi di una struttura dati avviene tramite un enumeratore, in pratica un oggetto che implementa l’interfaccia IEnumerable. In C# c’è una nuova parola chiave “yield“, che serve proprio per specificare gli elementi che dovrà ritornare un enumeratore, vediamone un esempio concreto:

using System;
using System.Collections;

public class Corso
{
        public static IEnumerable Animali()
        {
               yield return "Elefante";
               yield return "Leone";
               yield return "Cammello";
               yield return "Cane";
               yield return "Gatto";
        }

        static void Main(string[] args)
        {
              foreach (string s in Animali())
                    Console.WriteLine(s);

              Console.ReadKey();
        }
}

Ricordo sempre che un bravo programmatore quando non ricorda qualcosa, sa comunque dove andare a guardare e vi esorto a fare questo tipo di esercizio, create nuovo esempi e compilateli, se ci fossero degli errori osservate bene e poi cercate in Internet quello che non vi è chiaro.

<< Lezione Precedente – Inizio CorsoIndice LezioniLezione Successiva >>

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.