Ricerca…


introduzione

LINQ to Objects fa riferimento all'utilizzo di query LINQ con qualsiasi raccolta IEnumerable.

Come LINQ to Object esegue query

Le query LINQ non vengono eseguite immediatamente. Quando si crea la query, si sta semplicemente memorizzando la query per l'esecuzione futura. Solo quando si richiede effettivamente di iterare la query è la query eseguita (ad esempio in un ciclo for, quando si chiama ToList, Count, Max, Average, First, ecc.)

Questa è considerata un'esecuzione differita . Ciò consente di creare la query in più passaggi, potenzialmente modificandola in base a istruzioni condizionali e quindi eseguirla in un secondo momento solo dopo aver richiesto il risultato.

Dato il codice:

var query = from n in numbers 
            where n % 2 != 0
            select n;

L'esempio sopra memorizza solo la query nella variabile di query . Non esegue la query stessa.

L'istruzione foreach forza l'esecuzione della query:

foreach(var n in query) {
    Console.WriteLine($"Number selected {n}");
}

Alcuni metodi LINQ attivano anche l'esecuzione della query, Count , First , Max , Average . Restituiscono valori singoli. ToList e ToArray raccolgono i risultati e li trasformano rispettivamente in una lista o in una matrice.

Tenere presente che è possibile eseguire iterazioni sulla query più volte se si richiamano più funzioni LINQ sulla stessa query. Questo potrebbe dare risultati diversi ad ogni chiamata. Se vuoi lavorare con un solo set di dati, assicurati di salvarlo in un elenco o array.

Uso di LINQ su oggetti in C #

Una semplice query SELECT in Linq

static void Main(string[] args)
{
    string[] cars = { "VW Golf", 
                        "Opel Astra", 
                        "Audi A4", 
                        "Ford Focus", 
                        "Seat Leon", 
                        "VW Passat", 
                        "VW Polo", 
                        "Mercedes C-Class" };

    var list = from car in cars
               select car;

    StringBuilder sb = new StringBuilder();

    foreach (string entry in list)
    {
        sb.Append(entry + "\n");
    }

    Console.WriteLine(sb.ToString());
    Console.ReadLine();
}

Nell'esempio sopra, una serie di stringhe (auto) viene utilizzata come una raccolta di oggetti da interrogare usando LINQ. In una query LINQ, la clausola from viene prima di tutto per introdurre l'origine dati (automobili) e la variabile range (auto). Quando viene eseguita la query, la variabile di intervallo servirà come riferimento per ciascun elemento successivo nelle automobili. Poiché il compilatore può inferire il tipo di auto, non è necessario specificarlo esplicitamente

Quando il codice sopra è compilato ed eseguito, produce il seguente risultato: inserisci la descrizione dell'immagine qui

SELEZIONA con una clausola WHERE

var list = from car in cars
           where car.Contains("VW")
           select car;

La clausola WHERE viene utilizzata per interrogare l'array di stringhe (macchine) per trovare e restituire un sottoinsieme di array che soddisfi la clausola WHERE.

Quando il codice sopra è compilato ed eseguito, produce il seguente risultato:

inserisci la descrizione dell'immagine qui

Generazione di una lista ordinata

var list = from car in cars
           orderby car ascending 
           select car;

A volte è utile ordinare i dati restituiti. La clausola orderby causerà l'ordinamento degli elementi in base al confronto predefinito per il tipo da ordinare.

Quando il codice sopra è compilato ed eseguito, produce il seguente risultato:

inserisci la descrizione dell'immagine qui

Lavorare con un tipo personalizzato

In questo esempio, un elenco tipizzato viene creato, popolato e quindi interrogato

public class Car
{
    public String Name { get; private set; }
    public int UnitsSold { get; private set; }

    public Car(string name, int unitsSold)
    {
        Name = name;
        UnitsSold = unitsSold;
    }
}

class Program
{
    static void Main(string[] args)
    {

        var car1 = new Car("VW Golf", 270952);
        var car2 = new Car("Opel Astra", 56079);
        var car3 = new Car("Audi A4", 52493);
        var car4 = new Car("Ford Focus", 51677);
        var car5 = new Car("Seat Leon", 42125);
        var car6 = new Car("VW Passat", 97586);
        var car7 = new Car("VW Polo", 69867);
        var car8 = new Car("Mercedes C-Class", 67549);

        var cars = new List<Car> { 
            car1, car2, car3, car4, car5, car6, car7, car8 };
        var list = from car in cars
                   select car.Name;

        foreach (var entry in list)
        {
            Console.WriteLine(entry);
        }
        Console.ReadLine();
    }
}

Quando il codice sopra è compilato ed eseguito, produce il seguente risultato:

inserisci la descrizione dell'immagine qui

Fino ad ora gli esempi non sembrano sorprendenti in quanto si può semplicemente ripetere l'array per fare praticamente lo stesso. Tuttavia, con i pochi esempi qui sotto puoi vedere come creare query più complesse con LINQ to Objects e ottenere di più con molto meno codice.

Nell'esempio seguente possiamo selezionare le auto che sono state vendute oltre 60000 unità e ordinarle sul numero di unità vendute:

var list = from car in cars
           where car.UnitsSold > 60000 
           orderby car.UnitsSold descending 
           select car;

StringBuilder sb = new StringBuilder();

foreach (var entry in list)
{
    sb.AppendLine($"{entry.Name} - {entry.UnitsSold}");
}
Console.WriteLine(sb.ToString());

Quando il codice sopra è compilato ed eseguito, produce il seguente risultato: inserisci la descrizione dell'immagine qui

Nell'esempio qui sotto possiamo selezionare le auto che hanno venduto un numero dispari di unità e ordinarle alfabeticamente sopra il suo nome:

var list = from car in cars
           where car.UnitsSold % 2 != 0 
           orderby car.Name ascending 
           select car;

Quando il codice sopra è compilato ed eseguito, produce il seguente risultato: inserisci la descrizione dell'immagine qui



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow