Sulla Programmazione

Quattro chiacchere sulla programmazione e sulle bit-tecnologie con Fabrizio Cipriani

category: .NET

Le closures e C#

Chi è abituato ad usare internet per tenersi aggiornato, o chi legge gli ultimi libri sui linguaggi di programmazione, avrà sicuramente già incontrato il termine "closure".

Che cos'è una closure? Se siete arrivati qua con una ricerca su Google vi sarete già imbatutti in mille definizioni (un pò come mi accadde quando fui io a cercarle per la prima volta). Un esempio di closure dovrebbe facilitare le cose:

1
2
3
4
5
List<Video> FindAllShorterThen(List<Video> videos, int maxMinutes)
{  
 return lessons.FindAll(delegate(VideoLesson lesson)    
     { return lesson.Duration < maxMinutes; } );  // <-- closure
}

Per chi conosce il C# l'esempio ...

Conversioni tra System.Xml e System.Xml.Linq

Riporto qui una utile classe per la conversione di elementi System.Xml a System.Xml.Linq e viceversa:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System.Xml;
using System.Xml.Linq;

/// <summary>
/// Provides extension methods for simple conversion between System.Xml and System.Xml.Linq classes.
/// </summary>
public static class XmlLinqConversionExtensions {

    /// <summary>  
    /// Converts an XDocument to ...

Indice di un elemento in una query LINQ

Mettiamo che abbia bisogno di usare l'indice dell'elemento corrente di una query LINQ.

Ad esempio, partendo dalla lista:

String[] pezzi = {"pedone", "torre", "cavallo", "alfiere"};

voglio ottenere una unica stringa che contiene:

Pezzo numero 1:pedone, Pezzo numero 2: torre, etc.

Il metodo Select ha un overload con il parametro "index" che può essere utilizzato per conoscere l'indice dell'elemento corrente. In altre parole è possibile fare:

pezzi.Select((item, index) => "Pezzo numero " + index.ToString() + ": " + item)

Per ottenere esattamente l'output desiderato possiamo usare il metodo Join() della classe String:

Console.WriteLine(
    String.Join(", ", 
        pezzi.Select((item, index ...

Visual Studio 2008 - errore System Runtime InteropServices COMException durante il caricamento di un progetto ASP.NET con Vista/Windows 7

L'errore completo è:

“System.Runtime.InteropServices.COMException”

A giudicare da una veloce ricerca su Google, questo sembra essere un problema piuttosto comune sugli ultimi sistemi operativi Microsoft. L'articolo con la soluzione più completa l'ho trovata sul blog di Hanan Schwartzberg:

Lions Den

Il problema è che il progetto web che si sta caricando contiene una virtual directory che non esiste. Oppure, se esiste, Visual Studio non ha sufficienti diritti per verificarne l'esistenza, o non sono installate le API necessarie.

Per risolvere il problema occorre eseguire questi passi:

  • Eseguire Microsoft Visual Studio 2008 come amministratore
  • Aprire il ...

Accesso ad una proprietà di un dataitem parent all'interno di controlli databound annidati

Mettiamo di avere due controlli databound annidati come in questo esempio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<asp:Repeater Id="rptOuter" runat="server">
  <ItemTemplate>
      <asp:Repeater Id="rptInner" runat="server">
        <ItemTemplate>
          <tr>
            <td><%# Container.DataItem %></td>
          </tr>
        </ItemTemplate>
      </asp:Repeater>
  </ItemTemplate>
</asp:Repeater>

E una lista costruita in questo modo:

1
2
3
4
5
6
7
public class TestOuter
{
    public String Prefix { get; set; };
    List<String> TestInner { get; set; };
}

List<TestOuter> listDataSource = CostruisciListaTestOuter()

Se vogliamo visualizzare gerarchicamente il contenuto della lista listDataSource nel Repeater esterno rptOuter, e per ogni suo elemento la lista TestInner ...

Conversione di array e liste in stringhe csv (comma separated)

Mi trovo spesso a dover convertire liste, collections o array in stringhe con valori separati da virgola (csv). Con LINQ, questo può essere fatto in modo elegante ed efficiente su qualsiasi collection che implementi IEnumerable usando il metodo Join() della classe string:

string csvString = string.Join(",", from item in MyList select item.Value);

oppure per .net 3.5:

string csvString = string.Join(",", (from item in MyList select item.Value).ToArray());

Per le versioni precedenti di .Net che non supportano LINQ (< 3.5), il metodo più efficiente è usare la classe StringBuilder:

 1
 2
 3
 4
 5
 6
 7
 8
 9 ...

ASP.NET: eseguire chiamate javascript dopo il postback dell'UpdatePanel

Mi è capitato di dover eseguire del codice javascript dopo il postback dell'UpdatePanel, ed in particolare del codice javascript che fa uso di jQuery all'interno di un composite control, a sua volta inserito in un update panel.

La prima cosa che ho provato a fare è stata quella di inserire le linee javascript direttamente dentro l'evento RenderContents del composite control, ma ho realizzato subito che le linee javascript non vengono mai invocate, visto l'UpdatePanel ricarica il proprio contenuto dinamicamente con chiamata Ajax.

Aggiungere il codice javascript usando il metodo RegisterStartupScript ha migliorato un pò la situazione ...

Passaggio di un parametro DateTime ad un WebMethod (ASMX) con jQuery ajax

Non esiste molta documentazione su come scambiare valori DateTime tra javascript e un servizio .net (asmx). Un grande lavoro l'ha fatto Adam Schroder nel suo post sull'argomento

Un servizio ASP.NET decorato con il tag ScriptService accetta un datetime nel formato:

"\/Date(x)\/"

dove x è il valore ritornato dal metodo getTime() dell'oggetto javascript Date. Un parametro DateTime ha quindi più o meno questo aspetto quando viene passato nel parametro "data" di una chiamata al metodo ajax di jQuery:

'{ dateparam: "\\\/Date(' + (new Date()).getTime() + ')\\\/" }'

(Prefissiamo con il carattere di escape "\" anche la barra normale "/").

Il web service ...

C#: uso di delegate anonimi per le ricerche degli elementi di List

Un metodo veloce per ricercare qualcosa all'interno di una List è fare uso del metodo Find() passando come parametro un anonymous delegate. Ad esempio per ricercare un testo in una lista di string:

1
2
3
List<string> stringList = someStringList;
string result = stringList.Find( 
  delegate(string s) { return s == "testo da ricercare"; });

Il metodo Find() di List esegue una ricerca lineare, partendo dal primo elemento della lista, chiamando ad ogni iterazione il delegate e fermandosi quando trova un match (cioè quando il delegate ritorna True).

Il delegate anonimo può essere utilizzato anche con gli altri metodi per le ricerche ...

Upload di file di grandi dimensioni in .net: uploadify

Cercando un oggetto solido ed efficiente per eseguire l'upload dei file in .net con annessa visualizzazione della progress bar, ho rispolverato Uploadify, che avevo scartato qualche mese fa per una esigenza simile (allora usai il modulo di Darren Johnstone assieme alla progress bar di Matt Berseth). 

Uploadify usa flash e javascript (jquery in particolare) per facilitare le operazioni di selezione ed upload del file, rendendo l'esperienza dell'utente fluida e piacevole. Il fatto che Flash sia installato sul 95% dei browser lo rende una buona scelta per diffusione e compatibilità. Il fatto che Flash non sia disponibile su ...