English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Vantaggi di LINQ

Per comprendere perché dovremmo utilizzare LINQ, guardiamo alcuni esempi. Supponiamo di voler trovare l'elenco degli studenti adolescenti da una serie di oggetti Student:

Prima di C#2.0, dovevamo utilizzare il ciclo "foreach" o "for" per esplorare le raccolte per trovare oggetti specifici. Ad esempio, dovevamo scrivere il seguente codice per trovare tutti gli oggetti studente in una serie di studenti con età tra 12 e 20 anni (adolescenti tra 13 e 19 anni):

In C# 1.0, utilizzare il ciclo for per cercare un elemento in una raccolta
class Student
{
    public int StudentID { get; set; }
    public String StudentName { get; set; }
    public int Age { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        Student[] studentArray = { 
            new Student() { StudentID = 1, StudentName = "John", Age = 18 },
            new Student() { StudentID = 2, StudentName = "Steve", Age = 21 },
            new Student() { StudentID = 3, StudentName = "Bill", Age = 25 },
            new Student() { StudentID = 4, StudentName = "Ram", Age = 20 },
            new Student() { StudentID = 5, StudentName = "Ron", Age = 31 },
            new Student() { StudentID = 6, StudentName = "Chris", Age = 17 },
            new Student() { StudentID = 7, StudentName = "Rob", Age = 19 },
        };
        Student[] students = new Student[10];
        int i = 0;
        foreach (Student std in studentArray)
        {
            if (std.Age > 12 && std.Age < 20)
            {
                students[i] = std;
                i++;
            }
        }
    }
}

L'uso del ciclo for è complicato, non mantenibile e ha una scarsa leggibilità. C# 2.0 ha introdotto l'incarico, che può essere utilizzato per questo scopo, come mostrato di seguito.

    Esempio: utilizzare l'incarico per cercare un elemento in una raccolta di C# 2.0

delegate bool FindStudent(Student std);
class StudentExtension
{ 
    public static Student[] where(Student[] stdArray, FindStudent del)
    {
        int i = 0;
        Student[] result = new Student[10];
        foreach (Student std in stdArray)
            if (del(std))
            {
                result[i] = std;
                i++;
            }
        return result;
    }
}
    
class Program
{
    static void Main(string[] args)
    {
        Student[] studentArray = { 
            new Student() { StudentID = 1, StudentName = "John", Age = 18 },
            new Student() { StudentID = 2, StudentName = "Steve", Age = 21 },
            new Student() { StudentID = 3, StudentName = "Bill", Age = 25 },
            new Student() { StudentID = 4, StudentName = "Ram", Age = 20 },
            new Student() { StudentID = 5, StudentName = "Ron", Age = 31 },
            new Student() { StudentID = 6, StudentName = "Chris", Age = 17 },
            new Student() { StudentID = 7, StudentName = "Rob", Age = 19 },
        };
        Student[] students = StudentExtension.where(studentArray, delegate(Student std){
                return std.Age > 12 && std.Age < 20;
            }
        }
    }
}

Quindi, utilizzando C#2.0, puoi sfruttare i vantaggi dei delegati per trovare studenti che soddisfano qualsiasi condizione. Non devi utilizzare un ciclo for per trovare studenti con criteri diversi. Ad esempio, puoi utilizzare la stessa funzione del delegato per trovare studenti con StudentId 5 o nome Bill, come segue:

Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentID == 5;
    }
//Inoltre, utilizzare lo stesso delegato per altre condizioni
Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentName == "Bill";
    }

Il team C# pensa che il codice debba essere ancora più compatto e leggibile. Pertanto, hanno introdotto nel C# 3.0 i metodi di estensione, le espressioni lambda, gli alberi espressivi, i tipi anonimi e le espressioni di query. Puoi utilizzare queste funzionalità del C# 3.0 (che sono i componenti di LINQ) per query su diversi tipi di insieme e ottenere elementi di risultato in un singolo comando.

Esempio: come utilizzare query LINQ con espressioni lambda per trovare uno studente specifico in un insieme di studenti.

Esempio: LINQ
class Program
static void Main(string[] args)
    {        
          Student[] studentArray = { 
                    new Student() { StudentID = 1, StudentName = "John", age = 18 } ,
                    new Student() { StudentID = 2, StudentName = "Steve", age = 21 } ,
                    new Student() { StudentID = 3, StudentName = "Bill", age = 25 } ,
                    new Student() { StudentID = 4, StudentName = "Ram", age = 20 } ,
                    new Student() { StudentID = 5, StudentName = "Ron", age = 31 } ,
                    new Student() { StudentID = 6, StudentName = "Chris", age = 17 } ,
                    new Student() { StudentID = 7, StudentName = "Rob", age = 19 } ,
           };
         // Utilizzare LINQ per trovare gli studenti adolescenti
         Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray();       
        // Utilizzare LINQ per trovare il primo studente con nome Bill 
        Student bill = studentArray.Where(s => s.StudentName == "Bill").FirstOrDefault();        
        // Utilizzo di LINQ per trovare lo studente con StudentID 5        
        Student student5 = studentArray.Where(s => s.StudentID == 5).FirstOrDefault();
    }
}

Come mostrato nell'esempio sopra, abbiamo specificato condizioni diverse utilizzando operatori LINQ e espressioni lambda in una singola istruzione. Pertanto, LINQ rende il codice più compatto e più leggibile e può essere utilizzato per interrogare diverse sorgenti di dati. Ad esempio, se avete una tabella di studenti in un database invece dell'array di oggetti studente sopra, potete ancora utilizzare la stessa query per trovare lo studente utilizzando Entity Framework.

Vantaggi di LINQ

  • Linguaggio familiare (linguaggio familiare): Gli sviluppatori non devono imparare un nuovo linguaggio di query per ogni tipo di sorgente di dati o formato di dati.

  • Meno codice (meno codice): In confronto ai metodi più tradizionali, riduce la quantità di codice da scrivere.

  • Leggibilità del codice (leggibilità del codice): LINQ rende il codice più leggibile, quindi altri sviluppatori possono comprenderlo e mantenere facilmente.

  • Metodo standardizzato per interrogare più sorgenti di dati (metodo standardizzato per interrogare più sorgenti di dati): La stessa sintassi LINQ può essere utilizzata per interrogare più sorgenti di dati.

  • Sicurezza di query a tempo di compilazione (sicurezza delle query a tempo di compilazione): Fornisce il controllo del tipo degli oggetti durante la compilazione.

  • Supporto IntelliSense (supporto di intelligenza): LINQ fornisce IntelliSense per le collection universali.

  • Shaping data (forma dei dati): Puoi cercare i dati in diverse forme.