在 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;
編譯並執行上述程式碼時,會產生以下結果: