在 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)。执行查询时,范围变量将用作对汽车中每个连续元素的引用。因为编译器可以推断汽车的类型,所以你不必明确指定它
编译并执行上述代码时,会产生以下结果:
使用 WHERE 子句进行 SELECT
var list = from car in cars
where car.Contains("VW")
select car;
WHERE 子句用于查询字符串数组(cars)以查找并返回满足 WHERE 子句的数组子集。
编译并执行上述代码时,会产生以下结果:
生成有序列表
var list = from car in cars
orderby car ascending
select car;
有时,对返回的数据进行排序很有用。orderby 子句将导致元素根据要排序的类型的默认比较器进行排序。
编译并执行上述代码时,会产生以下结果:
使用自定义类型
在此示例中,创建,填充并查询类型列表
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();
}
}
编译并执行上述代码时,会产生以下结果:
到目前为止,这些示例似乎并不令人惊讶,因为人们可以遍历数组来执行基本相同的操作。但是,通过下面的几个示例,你可以看到如何使用 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());
编译并执行上述代码时,会产生以下结果:
在下面的示例中,我们可以选择已售出奇数单位的汽车,并按其名称的字母顺序排序:
var list = from car in cars
where car.UnitsSold % 2 != 0
orderby car.Name ascending
select car;
编译并执行上述代码时,会产生以下结果: