C#探秘系列(一)——ToDictionary,ToLookup

C#探秘系列(一)——ToDictionary,ToLookup

概述

ToDictionary和ToLookup都是基于IEnumerable的扩展方法,可以将IEnumerable转换为Dictionary和ILookup。两个方法所能承载的数据结构不同,具体使用也有细微差别,下面我们来逐一讲解。

ToDictionary

描述

ToDictionary将IEnumerable中的元素转换为一个新的Dictionary对象,通过指定键选择器函数从元素中提取键,并通过指定元素选择器函数从元素中提取值。

语法

public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    Func<TSource, TElement> elementSelector
)

示例

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        List<Person> persons = new List<Person>()
        {
            new Person() { Id = 1, Name = "张三" },
            new Person() { Id = 2, Name = "李四" },
            new Person() { Id = 3, Name = "王五" },
        };

        Dictionary<int, string> personDict = 
            persons.ToDictionary(p => p.Id, p => p.Name);

        foreach (KeyValuePair<int, string> kvp in personDict)
        {
            Console.WriteLine("Key: {0}, Value: {1}", kvp.Key, kvp.Value);
        }
    }
}

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

输出结果:

Key: 1, Value: 张三
Key: 2, Value: 李四
Key: 3, Value: 王五

ToLookup

描述

ToLookup将IEnumerable中的元素转换为一个新的ILookup对象,通过指定键选择器函数从元素中提取键,并通过指定元素选择器函数从元素中提取值。

语法

public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    Func<TSource, TElement> elementSelector
)

示例

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        List<Person> persons = new List<Person>()
        {
            new Person() { Id = 1, Name = "张三" },
            new Person() { Id = 2, Name = "李四" },
            new Person() { Id = 3, Name = "张三" },
        };

        ILookup<string, Person> personLookup = 
            persons.ToLookup(p => p.Name, p => p);

        foreach (Person p in personLookup["张三"])
        {
            Console.WriteLine(p.Id);
        }
    }
}

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

输出结果:

1
3

总结

ToDictionary和ToLookup都是非常常用的方法,利用它们可以将IEnumerable中的数据转换为Dictionary或ILookup,方便操作和使用。要注意的是,ToLookup返回的是ILookup而不是Dictionary,ILookup可以包含重复的键,而Dictionary不行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#探秘系列(一)——ToDictionary,ToLookup - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C# jpg缩略图函数代码

    下面详细讲解一下“C# jpg缩略图函数代码”的完整攻略。 简介 在web开发中,我们通常需要对图片进行缩略操作以提升页面加载速度和用户的浏览体验。下面介绍一下如何使用C#代码实现对jpg格式的图片进行缩略操作。 步骤 第一步:引用命名空间 首先需要引用命名空间 System.Drawing,该命名空间提供了在图像操作方面非常强大的支持。 using Sys…

    C# 2023年6月7日
    00
  • C#下载歌词文件的同步和异步方法

    下面是关于C#下载歌词文件的同步和异步方法的完整攻略: 1. 同步方法: 1.1 首先,我们需要引入System.Net命名空间下的WebClient类。 WebClient类可以实现简单的HTTP协议,我们可以通过它来下载歌词文件。 1.2 接下来,我们可以使用DownloadFile方法实现下载。 DownloadFile方法有两个参数,第一个参数为待下…

    C# 2023年5月31日
    00
  • c#线程间传递参数详解

    当我们在使用C#语言进行多线程编程时,常常需要在线程之间传递数据。本文将详细讲解C#线程间传递参数的方法。 方法一:使用Lambda表达式 在使用线程时,我们常常使用new Thread()方法创建线程。这时候,可以使用Lambda表达式的形式,在创建线程的时候传递参数。具体方法如下: using System; using System.Threading…

    C# 2023年6月7日
    00
  • C#编程获取各种电脑硬件信息的方法示例

    C#是一种流行的面向对象编程语言,可以获取电脑硬件信息,并且是比较容易实现的。下面,我将分享一些示例代码,用以获得各种电脑硬件信息的方法。 硬件信息获取方法一:使用System.Management命名空间 System.Management命名空间提供了一种获取WMI(Windows Management Instrumentation)服务的方法,该服务…

    C# 2023年6月7日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,入魔篇(使用Docker+Jenkins实现持续集成、自动化部署)

    通过前面三篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus) 通过前面三篇文章的介绍,我们已经对.net co…

    C# 2023年5月3日
    00
  • .NET6使WebApi获取访问者IP地址

    .NET 6 Web API 获取访问者 IP 地址攻略 在 .NET 6 Web API 中,可以通过一些方法获取访问者的 IP 地址。本攻略将介绍如何使用这些方法来获取访问者的 IP 地址。 步骤 步骤1:创建一个新的 .NET 6 Web API 项目 首先,我们需要创建一个新的 .NET 6 Web API 项目。可以使用以下命令在命令行中创建一个新…

    C# 2023年5月17日
    00
  • C#类中方法的执行顺序是什么

    C#中类的方法执行顺序是按照继承层次关系和调用顺序决定的,具体执行顺序如下: 静态构造函数 非静态构造函数 静态方法 非静态方法 其中,静态成员在程序启动时就已经存在,因此静态构造函数是在其他方法之前第一个运行的。而非静态成员只有在实例化对象后才会存在,因此非静态构造函数是在静态构造函数之后但在其他方法之前运行的。 下面是两个简单的例子,说明类中方法的执行顺…

    C# 2023年6月1日
    00
  • Parallel.For循环与普通for循环的性能比较

    针对“Parallel.For循环与普通for循环的性能比较”的话题,我将给出一份详细的攻略,包含以下几个部分: 什么是Parallel.For循环? Parallel.For的性能优势是什么? 如何使用Parallel.For循环? Parallel.For循环的示例说明 普通for循环与Parallel.For循环的性能比较 下面就一步一步进行介绍。 1…

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