开发者

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

开发者 https://www.devze.com 2023-11-21 10:26 出处:网络 作者: chester·chen
目录集合表达式使用集合表达式解构自定义类型支持集合表达式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 = [javascript"three", "four"];
    List<List<string>> names3 = [["one", "two"], ["twww.devze.comhree", "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 选择加入集php合表达式支持。以下是个例子

[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.G编程客栈etEnumerator() => _buffer.GetEnumerator();
}

internal static class LineBufferBuilder
{
    internal static LineBuffer Create(ReadOnlySpan<char> valu编程客栈es) => 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语法糖内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号