在 C 中使用 LINQ to Objects

Linq 中的簡單 SELECT 查詢

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();
}

在上面的示例中,字串陣列(cars)用作要使用 LINQ 查詢的物件的集合。在 LINQ 查詢中,首先出現 from 子句以引入資料來源(cars)和範圍變數(car)。執行查詢時,範圍變數將用作對汽車中每個連續元素的引用。因為編譯器可以推斷汽車的型別,所以你不必明確指定它

編譯並執行上述程式碼時,會產生以下結果: StackOverflow 文件

使用 WHERE 子句進行 SELECT

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

WHERE 子句用於查詢字串陣列(cars)以查詢並返回滿足 WHERE 子句的陣列子集。

編譯並執行上述程式碼時,會產生以下結果:

StackOverflow 文件

生成有序列表

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

有時,對返回的資料進行排序很有用。orderby 子句將導致元素根據要排序的型別的預設比較器進行排序。

編譯並執行上述程式碼時,會產生以下結果:

StackOverflow 文件

使用自定義型別

在此示例中,建立,填充並查詢型別列表

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();
    }
}

編譯並執行上述程式碼時,會產生以下結果:

StackOverflow 文件

到目前為止,這些示例似乎並不令人驚訝,因為人們可以遍歷陣列來執行基本相同的操作。但是,通過下面的幾個示例,你可以看到如何使用 LINQ to Objects 建立更復雜的查詢,並通過更少的程式碼實現更多。

在下面的示例中,我們可以選擇已售出超過 60000 個單位的汽車,並對銷售的單位數量進行排序:

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());

編譯並執行上述程式碼時,會產生以下結果: StackOverflow 文件

在下面的示例中,我們可以選擇已售出奇數單位的汽車,並按其名稱的字母順序排序:

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

編譯並執行上述程式碼時,會產生以下結果: StackOverflow 文件