C#12中的Collection expressions集合表达式语法糖详解

 更新时间:2023年11月20日 11:16:18   作者:chester·chen  
C#12中引入了新的语法糖来创建常见的集合,并且可以使用..来解构集合,将其内联到另一个集合中,下面就跟随小编一起学习一下C#12中这些语法糖的使用吧

C#12中引入了新的语法糖来创建常见的集合。并且可以使用..来解构集合,将其内联到另一个集合中。

支持的类型

  • 数组类型,例如 int[]。
  • System.Span<T> 和 System.ReadOnlySpan<T>。
  • 支持常见泛型集合,例如 System.Collections.Generic.List<T>。

集合表达式使用

以下展示了如何使用集合表达式

static void Main(string[] args)
{
    List<string> names1 = ["one", "two"];
    List<string> names2 = ["three", "four"];
    List<List<string>> names3 = [["one", "two"], ["three", "four"]];
    List<List<string>> names4 = [names1, names2];
}

可以看出使用方法十分简单

集合表达式解构

在C#12中通过..即可将一个集合解构,并将其作为另一个集合的元素。

static void Main(string[] args)
{
    List<string> names1 = ["one", "two"];
    List<string> names2 = ["three", "four"];
    List<string> name = [.. names1, .. names2];
}

自定义类型支持集合表达式

类型通过编写 Create() 方法,和对集合类型应用System.Runtime.CompilerServices.CollectionBuilderAttribute 选择加入集合表达式支持。以下是个例子

[CollectionBuilder(typeof(LineBufferBuilder), "Create")]
public class LineBuffer : IEnumerable<char>
{
    private readonly char[] _buffer = new char[80];

    public LineBuffer(ReadOnlySpan<char> buffer)
    {
        int number = (_buffer.Length < buffer.Length) ? _buffer.Length : buffer.Length;
        for (int i = 0; i < number; i++)
        {
            _buffer[i] = buffer[i];
        }
    }

    public IEnumerator<char> GetEnumerator() => _buffer.AsEnumerable<char>().GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => _buffer.GetEnumerator();
}

internal static class LineBufferBuilder
{
    internal static LineBuffer Create(ReadOnlySpan<char> values) => new LineBuffer(values);
}

internal class Program
{
    static void Main(string[] args)
    {
        LineBuffer line = ['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'];
    }
}

首先,需要创建一个包含 Create 方法的类:LineBufferBuilder。LineBufferBuilder.Create方法必须返回 LineBuffer 对象,并且必须采用 ReadOnlySpan<char> 类型的单个参数。 

最后,必须将 CollectionBuilderAttribute添加到 LineBuffer 类声明。其中,第一个参数提供生成器类的名称, 第二个特性提供生成器方法的名称。

这样一个自定义的类就可以支持集合表达式了。

到此这篇关于C#12中的Collection expressions集合表达式语法糖详解的文章就介绍到这了,更多相关C#12语法糖内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#学习笔记整理_深入剖析构造函数、析构函数

    C#学习笔记整理_深入剖析构造函数、析构函数

    下面小编就为大家带来一篇C#学习笔记整理_深入剖析构造函数、析构函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • C#代码实现将PDF转换为PDF线性化格式

    C#代码实现将PDF转换为PDF线性化格式

    PDF 线性化是一种对 PDF 文件进行优化的方式,本文将为大家详细介绍如何使用C#代码将普通 PDF 转换为线性化 PDF,感兴趣的小伙伴可以参考一下
    2026-04-04
  • WPF利用DrawingContext实现绘制温度计

    WPF利用DrawingContext实现绘制温度计

    这篇文章主要为大家详细介绍了如何利用WPF和DrawingContext实现绘制温度计,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2022-09-09
  • C#中using的使用方式详解

    C#中using的使用方式详解

    这篇文章主要介绍了C#中using的使用方式方式详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 详解C#如何使用屏障实现多线程并发操作保持同步

    详解C#如何使用屏障实现多线程并发操作保持同步

    这篇文章主要为大家详细介绍了C#如何使用屏障实现多线程并发操作保持同步,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-01-01
  • C#通过流写入数据到文件的方法

    C#通过流写入数据到文件的方法

    这篇文章主要介绍了C#通过流写入数据到文件的方法,涉及C#通过字节流读写文件的相关技巧,需要的朋友可以参考下
    2015-07-07
  • C#实现页面GZip或Deflate压缩的方法

    C#实现页面GZip或Deflate压缩的方法

    这篇文章主要介绍了C#实现页面GZip或Deflate压缩的方法,涉及C#通过GZipStream与DeflateStream实现页面压缩的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C# OCR实现文字识别功能

    C# OCR实现文字识别功能

    OCR,中文叫做光学字符识别。它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并转换成一种计算机能够接受、人又可以理解的格式。本文将利用OCR实现文字识别功能,感兴趣的可以了解一下
    2022-11-11
  • C#生成DLL文件的方法小结

    C#生成DLL文件的方法小结

    这篇文章主要介绍了C#生成DLL文件的方法小结,需要的朋友可以参考下
    2015-07-07
  • C#之继承实现

    C#之继承实现

    本文详细讲解了C#之继承的实现,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论