.Select() 来自 LINQ 的方法语法,代码中的 select from a in list select a 用于查询语法。两者都是一样的,查询语法编译成方法语法。
你可能会看到:Query Syntax and Method Syntax in LINQ (C#)
投影:
Projection Operations - MSDN
投影是指将一个物体变换成一个物体的操作。
新形式通常只包含那些将被
随后使用。通过使用投影,您可以构造一个新类型
这是从每个对象构建的。您可以投影属性并执行
一个数学函数。也可以投影原图
对象而不改变它。
您可能还会看到:
LINQ Projection
转换查询结果的过程称为
投影。您可以在任何过滤器之后投影查询结果
已应用于更改集合的类型
返回。
Example from MSDN
List<string> words = new List<string>() { "an", "apple", "a", "day" };
var query = from word in words
select word.Substring(0, 1);
在上面的例子中,只有每个字符串实例的第一个字符被选择/投影。
您还可以从集合中选择一些字段并创建anonymous type 或现有类的实例,该过程称为投影。
from a in list select new { ID = a.Id}
在上面的代码中,Id 字段被投影到一个匿名类型中,忽略了其他字段。考虑到您的列表有一个 MyClass 类型的对象,其定义如下:
class MyClass
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
现在您可以将 Id 和 Name 投影到匿名类型,例如:
查询语法:
var result = from a in list
select new
{
ID = a.Id,
Name = a.Name,
};
方法语法
var result = list.Select(r => new { ID = r.Id, Name = r.Name });
您还可以将结果投影到新类。假设您有这样的课程:
class TemporaryHolderClass
{
public int Id { get; set; }
public string Name { get; set; }
}
那么你可以这样做:
查询语法:
var result = from a in list
select new TemporaryHolderClass
{
Id = a.Id,
Name = a.Name,
};
方法语法:
var result = list.Select(r => new TemporaryHolderClass
{
Id = r.Id,
Name = r.Name
});
您也可以投影到同一个类,前提是您不尝试投影到为 LINQ to SQL 或实体框架生成/创建的类。