ToB企服应用市场:ToB评测及商务社交产业平台

标题: C#12中的Collection expressions(集合表达式语法糖) [打印本页]

作者: 南飓风    时间: 2024-1-1 16:47
标题: C#12中的Collection expressions(集合表达式语法糖)
C#12中引入了新的语法糖来创建常见的集合。并且可以使用..来解构集合,将其内联到另一个集合中。
支持的类型
集合表达式使用
以下展示了如何使用集合表达式
  1. static void Main(string[] args)
  2. {
  3.     List<string> names1 = ["one", "two"];
  4.     List<string> names2 = ["three", "four"];
  5.     List<List<string>> names3 = [["one", "two"], ["three", "four"]];
  6.     List<List<string>> names4 = [names1, names2];
  7. }
复制代码
可以看出使用方法十分简单
 
集合表达式解构
在C#12中通过..即可将一个集合解构,并将其作为另一个集合的元素。
  1. static void Main(string[] args)
  2. {
  3.     List<string> names1 = ["one", "two"];
  4.     List<string> names2 = ["three", "four"];
  5.     List<string> name = [.. names1, .. names2];
  6. }
复制代码
 
自定义类型支持集合表达式
类型通过编写 Create() 方法,和对集合类型应用System.Runtime.CompilerServices.CollectionBuilderAttribute 选择加入集合表达式支持。以下是个例子
  1. [CollectionBuilder(typeof(LineBufferBuilder), "Create")]
  2. public class LineBuffer : IEnumerable<char>
  3. {
  4.     private readonly char[] _buffer = new char[80];
  5.     public LineBuffer(ReadOnlySpan<char> buffer)
  6.     {
  7.         int number = (_buffer.Length < buffer.Length) ? _buffer.Length : buffer.Length;
  8.         for (int i = 0; i < number; i++)
  9.         {
  10.             _buffer[i] = buffer[i];
  11.         }
  12.     }
  13.     public IEnumerator<char> GetEnumerator() => _buffer.AsEnumerable<char>().GetEnumerator();
  14.     IEnumerator IEnumerable.GetEnumerator() => _buffer.GetEnumerator();
  15. }
  16. internal static class LineBufferBuilder
  17. {
  18.     internal static LineBuffer Create(ReadOnlySpan<char> values) => new LineBuffer(values);
  19. }
  20. internal class Program
  21. {
  22.     static void Main(string[] args)
  23.     {
  24.         LineBuffer line = ['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'];
  25.     }
  26. }
复制代码
首先,需要创建一个包含 Create 方法的类:LineBufferBuilder。LineBufferBuilder.Create方法必须返回 LineBuffer 对象,并且必须采用 ReadOnlySpan 类型的单个参数。 
最后,必须将 CollectionBuilderAttribute添加到 LineBuffer 类声明。其中,第一个参数提供生成器类的名称, 第二个特性提供生成器方法的名称。
这样一个自定义的类就可以支持集合表达式了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4