C#中LINQ的Select与SelectMany函数使用

yizhihongxing

当我们需要对一个集合进行转换时,可以使用C#中的LINQ(Language Integrated Query)语句来实现。其中,LINQ中的Select和SelectMany函数就是用来做数据集合转换的。

Select函数

函数介绍

Select函数可以将集合中的每个元素转换为新的类型或值,并返回一个新的集合。Select函数的返回值类型为IEnumerable,其中TSource是集合元素的原始类型,而返回的是新的类型或值。

Select函数的方法签名如下:

public static IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TResult> selector
);

其中,source参数是要进行转换的集合,selector参数则是对每个元素进行转换的委托。

委托使用示例

下面是一个例子,假设有以下的Student类:

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public double Score { get; set; }
}

我们可以使用Select函数,将一个Student集合中每个元素的Name属性提取出来,返回一个新的字符串集合:

List<Student> students = new List<Student>()
{
    new Student { Name = "Tom", Age = 18, Score = 90 },
    new Student { Name = "Jerry", Age = 19, Score = 75 },
    new Student { Name = "Mike", Age = 20, Score = 85 },
    new Student { Name = "Lucy", Age = 18, Score = 95 }
};

List<string> names = students.Select(s => s.Name).ToList();

Lambda表达式使用示例

上述例子中selector参数使用了Lambda表达式,可以使用Lambda表达式更加方便地编写Select函数。Lambda表达式的格式如下:

source => expression

其中,source表示要转换的元素,而expression则是对元素进行转换的表达式。

SelectMany函数

函数介绍

SelectMany函数可以将嵌套的集合展开成一维集合,并且对展开后的每个元素进行转换。最后会返回一个新的集合。SelectMany函数的返回值类型为IEnumerable,其中TResult是转换后的类型。

SelectMany函数的方法签名如下:

public static IEnumerable<TResult> SelectMany<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, IEnumerable<TResult>> selector
);

委托使用示例

下面是一个例子,假设有以下的Teacher和Student类:

public class Teacher
{
    public string Name { get; set; }
    public List<Student> Students { get; set; }
}

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public double Score { get; set; }
}

我们可以使用SelectMany函数,将一个包含多个Teacher对象的集合,展开成一个包含所有Student对象的一维集合,并返回一个新的Student集合:

List<Teacher> teachers = new List<Teacher>()
{
    new Teacher 
    { 
        Name = "Teacher1", 
        Students = new List<Student>() 
        { 
            new Student { Name = "Tom", Age = 18, Score = 90 },
            new Student { Name = "Jerry", Age = 19, Score = 75 }
        }
    },
    new Teacher 
    { 
        Name = "Teacher2", 
        Students = new List<Student>() 
        { 
            new Student { Name = "Mike", Age = 20, Score = 85 },
            new Student { Name = "Lucy", Age = 18, Score = 95 }
        }
    }
};

List<Student> students = teachers.SelectMany(t => t.Students).ToList();

结果集合中包含了所有的Student对象:

Tom, Jerry, Mike, Lucy

其中,第一步使用SelectMany函数将每个Teacher对象的Students属性展开成一个一维集合;

第二步再使用Select函数,将每个元素的Name属性提取出来转换成字符串。

List<string> names = teachers.SelectMany(t => t.Students).Select(s => s.Name).ToList();

结果集合中包含了所有Student的Name属性:

Tom, Jerry, Mike, Lucy

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中LINQ的Select与SelectMany函数使用 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • 基于C# 写一个 Redis 数据同步小工具

    下面我会详细的介绍“基于C# 写一个 Redis 数据同步小工具”的完整攻略: 简介 Redis是一种基于内存的数据结构存储系统,常用于缓存、消息队列和数据存储等场景。在不同的应用场景中,我们经常需要将 Redis中的数据同步至其他系统。本文将介绍使用C#编写一个Redis数据同步小工具。 安装 Redis 首先需要在本地安装Redis,Redis官网上提供…

    C# 2023年5月31日
    00
  • ASP.NET Mvc开发之EF延迟加载

    ASP.NET Mvc是一个广泛应用于Web应用程序开发的框架,其通过使用模型-视图-控制器(MVC)设计模式来促进代码的组织、维护和测试。而在ASP.NET Mvc应用程序的开发中,数据库访问和数据操作是非常重要的一部分,其中基于Entity Framework(EF)的数据操作是最常用的方式之一。 本攻略将详细讲解在ASP.NET Mvc开发中使用EF延…

    C# 2023年5月31日
    00
  • .net 生成拼音码与五笔码实例代码

    针对如何实现“.NET 生成拼音码与五笔码”这个功能,我们可以采用以下两种方式。 1. 使用第三方库实现 可以使用第三方库实现该功能,比如 Pinyin4net、Microsoft Input Method Editor(IME)等。其中,Pinyin4net 是一款开源的拼音转换库,支持多种方式的拼音解析,而 Microsoft IME 是 Microso…

    C# 2023年5月31日
    00
  • C#中自定义事件和委托实例

    C#中自定义事件和委托实例是一项重要的编程技能。下面是一个完整的攻略,包括理解委托和事件、如何自定义委托和事件、如何订阅和取消订阅事件、如何触发事件等。 理解委托和事件 委托是一种类型,它可以封装一个或多个方法。委托类型的实例可以指向任何具有与其签名匹配的方法。在C#中,委托是如何定义的: delegate void MyDelegate(int arg1,…

    C# 2023年5月31日
    00
  • 在asp.NET中字符串替换的五种方法第2/2页

    好的。在asp.NET中字符串替换的五种方法是一个比较常见的问题。我将为您提供完整攻略,包括步骤、代码块和示例说明。 步骤 在ASP.NET中,字符串替换的五种方法如下: Replace 方法 Regex.Replace 方法 StringBuilder.Replace 方法 StringBuffer.Replace 方法 String.Format 方法 …

    C# 2023年6月3日
    00
  • C#利用Random得随机数求均值、方差、正态分布的方法

    生成指定数量的随机数 首先需要生成指定数量的随机数,C#中使用Random类可以很方便地实现这个功能。下面是一个生成100个随机数的示例代码: int n = 100; double[] nums = new double[n]; Random rand = new Random(); for (int i = 0; i < n; i++) { num…

    C# 2023年6月7日
    00
  • C#中使用Socket获取网页源代码的代码

    使用Socket获取网页源代码的代码,一般需要以下几个步骤: 解析主机名和IP地址: 使用Dns类解析主机名(如www.baidu.com)对应的IP地址。代码如下: IPHostEntry hostEntry = Dns.GetHostEntry("www.baidu.com"); IPAddress ipAddress = hostE…

    C# 2023年6月7日
    00
  • C# DirectoryInfo.GetFiles – 获取目录下的所有文件信息

    DirectoryInfo.GetFiles() 方法是C#文件操作中用于获取目录中所有文件的方法之一。该方法可以返回当前 DirectoryInfo 的所有文件(包括子目录中的文件),并且可以使用模式进行过滤。 DirectoryInfo.GetFiles() 方法返回一个 FileInfo 数组,其中每个文件都表示找到的文件。可以使用 FileInfo …

    C# 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部