Devo usare Visual Studio 2005. Quali sono le buone alternative all'utilizzo di LINQ?

5

Recentemente ho iniziato un nuovo lavoro e sono costretto a utilizzare VS 2005 e .NET 2. Questo è stato piuttosto doloroso per una serie di motivi, ma l'unico grande cambiamento da VS 2005 ai suoi successori è stata l'introduzione di LINQ e metodi di estensione.

Un modello comune che seguivo quando usavo le enumerazioni era il seguente:

foreach(var myObject in myObjects.Where(x => x.Property == someValue)
{
    //Do some stuff
}

Ciò di cui sto avendo difficoltà sta arrivando con un modo sintetico di esprimere la stessa affermazione in C # 2. La cosa migliore che ho trovato è la seguente:

foreach(MyObject myObject in myObjects)
{
    if(myObject.Property == someValue)
    {
        //Do some stuff
    }
}

C'è un modo più efficace o più efficiente di scrivere questo codice?

Come scriveresti il codice C # 2 in modo che possa essere facilmente trasformato nel codice C # 5 (aggiorneremo a VS2012 / .NET 4.5 dopo la prossima versione)?

    
posta Stephen 19.09.2013 - 02:51
fonte

2 risposte

10

Bene, hai alcuni bit interessanti da superare:

  • La sintassi lambda non è stata introdotta fino a VS 2008, quindi dovresti implementare l'utilizzo di delegati anonimi.
  • Non è nemmeno possibile simulare i metodi di estensione per .NET 2 con VS 2005. Solo VS 2008.
  • Func<> e i relativi parenti non sono stati introdotti fino a .NET 3.5
  • I delegati Func<> sono covarianti sul loro input e controvarianti sul loro output. Non l'avrò fino a .NET 4, quindi il tuo utilizzo potrebbe essere limitato.

Detto questo, se prendi LINQBridge , dovresti essere in grado di rimuovere la sintassi del metodo di estensione e utilizzarla .

Modifica

Quindi, per i sorrisi e le risatine, ho appena tradotto LINQBridge in .NET 2.0 / VS 2005. È stato facile, ma non terribilmente piacevole :) Il tuo esempio foreach sopra sarebbe finito così dopo il ripasso:

foreach(MyObject myObject in Enumerable.Where(myObjects, delegate(MyObject x) { return x.Property == someValue; }))
{
    //Do some stuff
}

Questo mi fa pensare che il tuo non-LINQ foreach sia molto più facile da leggere per l'ambiente in cui lavori.

    
risposta data 19.09.2013 - 03:26
fonte
4

Prima dell'introduzione di LINQ, abbiamo utilizzato PowerCollections ( link ). Per darti alcuni esempi:

Algorithms.Convert(enumerable, converter) <=> enumerable.Select(converter)
Algorithms.Exists(enumerable, predicate) <=> enumerable.Any(predicate)
Algorithms.FindFirstWhere(enumerable, predicate) <=> enumerable.FirstOrDefault(predicate)

e così via. Sfortunatamente, dovrai usare questa sintonia "delegate (...) {...}" goffa invece della sintassi lambda, ma tecnicamente è la stessa cosa.

Buona fortuna!

    
risposta data 20.09.2013 - 17:03
fonte

Leggi altre domande sui tag