In un articolo precedente abbiamo spiegato l'utilizzo del costrutto "yield return", oggi vediamo come validare in maniera efficace gli argomenti di un metodo che utilizza al suo interno lo yield return, in particolare mostreremo la strategia che viene utilizzata nell'implementazione di LINQ. Molti metodi di LINQ hanno un'esecuzione differita: le query non vengono eseguite nel m ...

In C# siamo abituati a definire ed utilizzare funzioni che hanno parametri multipli in ingresso, ad esempio l'addizione. Se per qualche motivo volessimo o avessimo solamente funzioni che prendono in input un unico parametro potremmo comunque rappresentare ed utilizzare le funzioni che oggi definiamo con più parametri? La risposta è sì e questo procedimento di riduzione delle fu ...

In C# è possibile definire delle funzioni in linea e utilizzarle come tutte le altre variabili ovvero passarle come parametri ai metodi, restituirle come risultato di un metodo e in più, essendo funzioni, possiamo invocarle. Uno scenario ricorrente in questi casi, sicuramente familiare a chi ha utilizzato LINQ in una delle sue tante forme, è quella di utilizzare all'interno di ...

Cominciamo ad analizzare oggi il metodo LinqToObjects Select. Vediamo i due overload presenti   public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSour ...

Il metodo "Monte Carlo" è una stategia di risoluzione di problemi che utilizza la statistica: se la probabilità di un certo evento è P possiamo simulare in maniera random questo evento e ottenere P facendo (numero di volte in cui il nostro evento è avvenuto)/(simulazioni totali). Vediamo come applicare questa strategia per ottenere un'approssimazione di pi greco. Data un cerchi ...

I linguaggi funzionali come F# incoraggiano l'utilizzo della ricorsione piuttosto che dell'iterazione.  Solitamente quando una funzione o un metodo ne chiamano un altro viene aggiornata la "call stack" ovvero la pila che tiene traccia appunto della posizione in cui siamo nell'esecuzione e in quale punto dobbiamo eventualmente tornare.  Nel caso di ricorsioni molto profonde s ...

Supponiamo di avere un metodo che dobbiamo chiamare più volte e che esegue un calcolo lungo o comunque dispendioso in termini di risorse.  Supponiamo anche che non sappiamo prevedere con che parametri chiameremo questo metodo e quindi capiterà di chiamarlo più volte bella stessa esecuzione con gli stessi parametri e ripetere lo stesso calcolo più volte.  Come si ottimizza un ...

Continuiamo con l'analisi del metodo LinqToSQL Where. La prima parte può essere trovata qui Cominciamo col riportare il codice del metodo: public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.A ...

Da questo post inizieremo ad analizzare tutti i metodi che compongono LinqToSQL e le loro rispettive implementazioni, liberamente consultabili sul sito http://referencesource.microsoft.com. La maggior parte dei metodi LinqToSQL sono extension method definiti nella classe statica Enumerable e applicabili ad oggetti che implementano l’interfaccia IEnumerable<T> (quindi la v ...

Per implementare l'interfaccia Ienumerable è necessario poter costruire una istanza di un IEnumerator. È necessario quindi implementare i metodi: - MoveNext - Reset - Dispose E la proprietà Current sia nella versione generica che in quella non generica in quanto l'interfaccia generica estende quella non generica. Per semplificare questo processo è possibile utilizzare l’istruzi ...