ZetCode

C# LINQ Select

上次修改时间:2024 年 1 月 19 日

在本文中,我们将展示如何使用 LINQ 的 Select 方法和 select 子句将元素映射到表达式。

语言集成查询 (LINQ) 是一种特定领域的语言,用于查询来自各种数据源的数据,包括数组、列表、XML 文件或数据库。

select 子句或 Select 方法将序列的每个元素投影为新形式。它选择、投影和转换集合中的元素。在其他语言中,Select 通常被称为 Map。

Enumerable.Select 方法接受一个选择器函数作为参数。选择器是一个转换函数,它应用于每个源元素。

C# LINQ Select 简单示例

第一个示例是一个简单的程序,它使用 LINQ Select。

Program.cs
List<int> vals = [1, 2, 3, 4, 5, 6];

var res = vals.Select(e => e * 2);
Console.WriteLine(string.Join(',', res));

该程序定义了一个整数列表。所有元素都乘以 2。

var res = vals.Select(e => e * 2);

Select 方法将给定的 lambda 表达式应用于每个元素。它返回一个由选择器函数修改的值序列。

$ dotnet run 
2,4,6,8,10,12

C# LINQ Func 选择器

Func 是一个内置的泛型委托类型。它可以与方法、匿名方法或 lambda 表达式一起使用。

Program.cs
List<int> vals = [1, 2, 3, 4, 5, 6];

Func<int, int> byfive = e => e * 5; 

var res = vals.Select(byfive);
Console.WriteLine(string.Join(',', res));

该程序将 Func 委托应用于列表的元素。

$ dotnet run
5,10,15,20,25,30

C# LINQ select 子句

查询表达式是一种替代的 LINQ 语法。在查询表达式中,我们使用 select 子句。

Program.cs
List<string> words = ["sky", "cup", "loud", "war", "water"];

var res = from word in words
          select word.Length;

Console.WriteLine(string.Join(',', res));

在该程序中,我们将单词列表转换为单词长度的序列。

$ dotnet run
3,3,4,3,5

C# LINQ 带索引的选择器

我们可以将元素的索引传递给选择器函数。

Program.cs
List<string> words = ["sky", "cup", "loud", "war", "water"];

var res = words.Select((e, idx) => new { idx, len = e.Length });

foreach (var e in res)
{
    Console.WriteLine($"{e}");
}

在该程序中,结果对象还包括元素的索引。

$ dotnet run
{ idx = 0, len = 3 }
{ idx = 1, len = 3 }
{ idx = 2, len = 4 }
{ idx = 3, len = 3 }
{ idx = 4, len = 5 }

C# LINQ select 投影

select 子句也执行投影。 投影是从返回的对象中选择特定的字段。

Program.cs
List<User> users =
[
    new ("John", "Doe", 1230),
    new ("Lucy", "Novak", 670),
    new ("Ben", "Walter", 2050),
    new ("Robin", "Brown", 2300),
    new ("Amy", "Doe", 1250),
    new ("Joe", "Draker", 1190),
    new ("Janet", "Doe", 980),
    new ("Albert", "Novak", 1930),
];

var res = from user in users
          orderby user.Salary
          select user.Salary;

Console.WriteLine(string.Join('\n', res));

record User(string FirstName, string LastName, int Salary);

我们有一个用户列表,包含三个字段:名字、姓氏和薪水。 我们按薪水对用户进行排序,并在结果序列中仅选择薪水字段。

$ dotnet run
670
980
1190
1230
1250
1930
2050
2300

来源

Enumerable.Select 方法

在本文中,我们介绍了 LINQ Select 操作。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程