在 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 文档