c# 投影最小_如何在C#中使用投影

c# 投影最小

投影是一种转换查询结果的操作。 您可以使用投影将对象转换为仅具有应用程序所需属性的新形式。 在本文中,我们将研究如何在C#中使用投影。

若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019

[ 同样在InfoWorld上:Visual Studio Code与Visual Studio:如何选择 ]

在Visual Studio中创建控制台应用程序项目

首先,让我们在Visual Studio中创建一个.NET Core控制台应用程序项目。 假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建新的.NET Core控制台应用程序项目。

  1. 启动Visual Studio IDE。
  2. 点击“创建新项目”。
  3. 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
  4. 点击下一步。
  5. 在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
  6. 单击创建。
  7. 这将在Visual Studio 2019中创建一个新的.NET Core控制台应用程序项目。我们将在本文的后续部分中使用此项目。

C#中的投影是什么?

投影是指将对象转换为新形式的行为,以使新创建的对象仅包含将要使用的属性。 语言集成查询(LINQ)支持两个标准查询投影运算符Select和SelectMany。

您可以使用Select和SelectMany运算符来投影单个属性,或投影查询的结果,或将数据源中的多个属性投影为匿名类型。 您甚至可以根据需要对投影执行计算,过滤或其他任何操作。

在以下各节中,我们将研究如何在C#中使用这些运算符。

使用C#中的Select运算符进行项目

在Program.cs文件中编写以下代码。

public class Author
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public Author(int id, string firstName,
    string lastName, string address)
    {
        this.Id = id;
        this.FirstName = firstName;
        this.LastName = lastName;
        this.Address = address;
    }
}

以下代码段说明了如何利用Select运算符查询数据。

var authors = new List<Author>
{
   new Author(1, "Joydip","Kanjilal", "Hyderabad, INDIA"),
   new Author(2, "Anand","Naraswamy", "Cochin, INDIA"),
   new Author(3, "Steve","Smith", "Ohio, USA"),
   new Author(4, "Uday","Denduluri", "London, UK")
};
foreach(var name in authors.Select(e => e.FirstName))
{
   Console.WriteLine(name);
}

当您执行上面的代码片段时,所有作者的名字都将显示在控制台窗口中。

[ 同样在InfoWorld上:每个开发人员都有10个Visual Studio Code扩展 ]

项目到C#中的匿名类型

您可以从数据源投影多个属性,甚至还可以投影到匿名类型。 以下代码段说明了如何将多个属性投影到匿名类型中。

var data = authors.Select(e => new { e.FirstName, e.LastName });

在C#中使用SelectMany运算符进行项目

您可以利用SelectMany运算符从实现IEnumerable <T>接口的集合中查询数据。 要查询多个集合中的数据并将其投影或展平为单个序列时,可以使用SelectMany运算符。

请注意,Select和SelectMany均从源值中产生结果。 Select从每个源值生成单个结果,而SelectMany从每个源值生成连接的子集合。

现在让我们在Author类中添加一个名为Subjects的额外属性。 此属性是一个字符串列表,其中包含作者撰写书籍的主题名称。

public class Author
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        public List<string> Subjects { get; set; }
        public Author(int id, string firstName, string lastName,
        string address, List<string> subjects)
        {
            this.Id = id;
            this.FirstName = firstName;
            this.LastName = lastName;
            this.Address = address;
            this.Subjects = subjects;
        }
    }

[ 也在InfoWorld上:微软开发人员工具和技术将在2020年进行探索 ]

您可以使用以下代码段创建作者列表。

var authors = new List<Author>
{
    new Author(1, "Joydip","Kanjilal", "Hyderabad, INDIA",
    new List<string>{"C#", "F#"} ),
    new Author(2, "Anand","Naraswamy", "Cochin, INDIA", 
    new List<string>{"C#", "VB.NET"}),
    new Author(3, "Steve","Smith", "Ohio, USA", 
    new List<string>{"C#", "C++"}),
    new Author(4, "Uday","Denduluri", "London, UK", 
    new List<string>{"C#", "VB.NET"}),
    new Author(5, "Jane","Barlow", "London, UK", 
    new List<string>{"C#", "C++"})
 };

而且,您可以使用下面的代码片段来检索作者写书的编程语言的名称。

var data = authors.SelectMany(a => a.Subjects).Distinct();
foreach (var subject in data)
{
    Console.WriteLine(subject);
}

使用Where运算符在C#中过滤结果数据

您可以在SelectMany之后应用Where运算符来过滤结果集。 下面的代码片段在执行时显示了名字和作者的主题,名字的作者以字符“ J”开头并位于英国

var data = authors
.Where(a => a.Address.IndexOf("UK") >= 0)
.SelectMany(a => a.Subjects, (a, Subject) => new { a.FirstName, Subject })
.Where(n => n.FirstName.StartsWith("J"));
foreach(var author in data)
{
    Console.WriteLine(author);
}

[ 通过InfoWorld的App Dev Report新闻通讯了解软件开发中的热门话题 ]

当执行上述代码片段时,您应该在控制台窗口中看到输出,如下图所示。

运算符输出c锋利的地方 IDG

使用EF Core时可以使用投影,因此您只能从应用程序所需的基础数据库中检索列。 在以后的文章中,我将讨论一些使用投影的高级操作,例如一对多投影,结果过滤和排序。

翻译自: https://www.infoworld.com/article/3514408/how-to-use-projections-in-c-sharp.html

c# 投影最小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值