📜  LINQ-查询运算符(1)

📅  最后修改于: 2023-12-03 15:02:41.653000             🧑  作者: Mango

LINQ-查询运算符

LINQ(Language Integrated Query)是一种语言级别集成的查询技术,可以用于从各种数据源中获取数据。查询运算符是 LINQ 的重要组成部分,它们提供了一组方法,用于查询数据。

在本文中,我们将介绍一些常用的查询运算符,以及它们的用法和示例代码。

基本语法

查询运算符是 LINQ 的扩展方法,它们可以通过调用 System.Linq 命名空间中的静态方法来使用。查询运算符的基本语法如下:

var result = from item in source
             [where condition]
             [orderby field]
             [select item];

其中,source 可以是一些集合数据类型,如 ListArrayDictionary 等,也可以是实现 IEnumerableIQueriable 接口的数据源。whereorderby 是可选的关键字,用于指定查询条件和排序方式。select 用于指定查询的结果。

具体的查询运算符会使用不同的语法和关键字,下面我们将逐个介绍。

Where

Where 方法用于筛选序列中满足指定条件的元素,并返回一个新的序列。它的语法如下:

var result = source.Where(item => condition);

其中,item 表示遍历序列时的当前元素,condition 是一个返回布尔值的 lambda 表达式,表示筛选条件。

例如,我们可以使用 Where 方法从一个整数集合中筛选出大于 5 的元素:

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var result = numbers.Where(n => n > 5);
foreach (var item in result)
{
    Console.WriteLine(item);
}
// Output: 6, 7, 8, 9, 10
Select

Select 方法用于对序列中的每个元素进行投影操作,并返回一个新的序列。它的语法如下:

var result = source.Select(item => expression);

其中,item 表示遍历序列时的当前元素,expression 是一个返回任意类型的 lambda 表达式,表示对元素进行投影的操作。

例如,我们可以使用 Select 方法对一个字符串集合中的每个元素进行转换并返回相应的长度:

string[] words = { "apple", "banana", "cherry", "date" };
var result = words.Select(s => s.Length);
foreach (var item in result)
{
    Console.WriteLine(item);
}
// Output: 5, 6, 6, 4
OrderBy

OrderBy 方法用于对序列中的元素按指定字段进行升序排序,并返回一个新的序列。它的语法如下:

var result = source.OrderBy(item => field);

其中,item 表示遍历序列时的当前元素,field 是一个表示排序字段的 lambda 表达式。

例如,我们可以使用 OrderBy 方法对一个字符串集合按长度进行升序排序:

string[] words = { "apple", "banana", "cherry", "date" };
var result = words.OrderBy(s => s.Length);
foreach (var item in result)
{
    Console.WriteLine(item);
}
// Output: date, apple, banana, cherry
GroupBy

GroupBy 方法用于对序列中的元素按指定字段进行分组,并返回一个新的序列。它的语法如下:

var result = source.GroupBy(item => field);

其中,item 表示遍历序列时的当前元素,field 是一个表示分组字段的 lambda 表达式。

例如,我们可以使用 GroupBy 方法对一个字符串集合按首字母进行分组:

string[] words = { "apple", "banana", "cherry", "date" };
var result = words.GroupBy(s => s[0]);
foreach (var group in result)
{
    Console.WriteLine($"Group '{group.Key}':");
    foreach (var item in group)
    {
        Console.WriteLine($"    {item}");
    }
}
// Output:
// Group 'a':
//     apple
// Group 'b':
//     banana
//     cherry
// Group 'd':
//     date
Join

Join 方法用于将两个序列中的元素进行关联,并返回一个新的序列。它的语法如下:

var result = source.Join(
    inner, 
    outerKeySelector, 
    innerKeySelector, 
    resultSelector);

其中,sourceinner 分别表示要关联的两个序列,outerKeySelectorinnerKeySelector 分别表示两个序列中要匹配的键,resultSelector 表示关联后需要返回的结果。

例如,我们可以使用 Join 方法将两个实体集合进行关联:

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

class Order
{
    public int PersonId { get; set; }
    public string ProductName { get; set; }
}

List<Person> people = new List<Person>
{
    new Person { Id = 1, Name = "Alice" },
    new Person { Id = 2, Name = "Bob" },
    new Person { Id = 3, Name = "Charlie" },
};
List<Order> orders = new List<Order>
{
    new Order { PersonId = 1, ProductName = "Apple" },
    new Order { PersonId = 2, ProductName = "Banana" },
    new Order { PersonId = 3, ProductName = "Cherry" },
};
var result = people.Join(
    orders,
    p => p.Id,
    o => o.PersonId,
    (p, o) => new { Name = p.Name, ProductName = o.ProductName });
foreach (var item in result)
{
    Console.WriteLine($"Person '{item.Name}' bought '{item.ProductName}'.");
}
// Output:
// Person 'Alice' bought 'Apple'.
// Person 'Bob' bought 'Banana'.
// Person 'Charlie' bought 'Cherry'.