C#12中的Collection expressions(集合表達式語法糖)

来源:https://www.cnblogs.com/chenyishi/archive/2023/11/20/17843378.html
-Advertisement-
Play Games

C#12中引入了新的語法糖來創建常見的集合。並且可以使用..來解構集合,將其內聯到另一個集合中。 支持的類型 數組類型,例如 int[]。 System.Span<T> 和 System.ReadOnlySpan<T>。 支持常見泛型集合,例如 System.Collections.Generic. ...


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 類聲明。其中,第一個參數提供生成器類的名稱, 第二個特性提供生成器方法的名稱。

這樣一個自定義的類就可以支持集合表達式了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文翻譯自:https://medium.com 今天,我想談談 Spring 提供的@Transactional(readOnly = true)。 之所以聊這個是因為我公司項目的代碼里有很多@Transactional(readOnly = true),用過的同學都說@Transactional ...
  • 在這篇文章中,我們介紹了函數的兩種不常用的特殊用法:匿名函數和裝飾器函數。匿名函數是一種沒有名稱的函數,通常用於定義簡單的功能。我們可以使用lambda關鍵字來創建匿名函數,併在需要時直接調用它們。裝飾器函數是一種特殊的函數,可以接受一個函數作為參數,並返回一個新的函數。裝飾器函數通常用於在不改變原... ...
  • 使用 Go 語言開髮網絡代理服務可以通過以下步驟完成。這裡,我們將使用 golang.org/x/net/proxy 包來創建一個簡單的 SOCKS5 代理服務作為示例。 步驟 1. 安裝 golang.org/x/net/proxy 包 使用以下命令安裝 golang.org/x/net 包,該包 ...
  • 本文只發佈於利用OpenCV實現尺度不變性與角度不變性的特征找圖演算法和知乎 一般來說,利用OpenCV實現找圖功能,用的比較多的是模板匹配(matchTemplate)。筆者比較喜歡裡面的NCC演算法。但是模板有個很明顯的短板,面對尺度改變,角度改變的目標就無能為力了。因此本文旨在做到模板匹配做不到的 ...
  • ​ .NET主流ORM 下麵是3款.NET 使用最多的ORM,來自公眾號投票結果 ,數據比較真實可靠,也可去搜索公眾號繼續投票 測試項目發佈時間微信公眾號投票 (追逐時間光者)使用難度功能性能 SqlSugar orm 2014 26% 491票 適中 全 中高 EFCore orm 2016 36 ...
  • 本章將和大家分享 Elasticsearch 的一些基本概念。話不多說,下麵我們直接進入主題。 一、什麼是Lucene Lucene是Apache的開源搜索引擎類庫,提供了搜索引擎的核心API。 1、Lucene的優勢:易擴展、高性能(基於倒排索引) 2、Lucene的缺點:只限於Java語言開發、 ...
  • XML相關 Xml是可拓展標記語言,一種文件格式。我們使用xml來完成對數據持久化的存儲。等待我們有一程式運行結束之後,將記憶體中的數據進行保存,(保存在硬碟/伺服器)實現對數據的持久化存儲。 xml文件的讀取和保存以及修改 要點: XMl文件的載入 XML文件節點的查找訪問 XML文件節點內容的讀取 ...
  • 前言 最近還在和 npgsql 與 EF Core 鬥爭,由於 EF Core 暫時還不支持 AOT,因此在 AOT 應用程式中使用 EF Core 時,會提示問題: 聽這個意思,似乎使用 Compiled Model 可以解決問題,於是就又研究了一下 EF Core 的這個功能。 在 EF Cor ...
一周排行
    -Advertisement-
    Play Games
  • 當使用Autofac處理一個介面有多個實現的情況時,通常會使用鍵(key)進行區分或者通過IIndex索引註入,也可以通過IEnumerable集合獲取所有實例,以下是一個具體的例子,演示如何在Autofac中註冊多個實現,並通過構造函數註入獲取指定實現。 首先,確保你已經安裝了Autofac Nu ...
  • 本篇將分享Prometheus+Grafana的監控平臺搭建,並監控之前文章所搭建的主機&服務,分享日常使用的一些使用經驗本篇將配置常用服務的監控與面板配置:包括 MySQL,MongoDB,CLickHouse,Redis,RabbitMQ,Linux,Windows,Nginx,站點訪問監控,已... ...
  • 使用Aspirate可以將Aspire程式部署到Kubernetes 集群 工具安裝 dotnet tool install -g aspirate --prerelease 註意:Aspirate 正在開發中,該軟體包將作為預覽版進行版本控制,--prelease 選項將獲得最新的預覽版。 容器註 ...
  • 前言 本文要說的這種開發模式,這種模式並不是只有blazor支持,js中有一樣的方案next.js nuxt.js;blazor還有很多其它內容,本文近關註漸進式開發模式。 是的,前後端是主流,不過以下情況也許前後端分離並不是最好的選擇: 小公司,人員不多,利潤不高,創業階段能省則省 個人開發者,接 ...
  • 在.NET中,Microsoft.Extensions.Logging是一個靈活的日誌庫,它允許你將日誌信息記錄到各種不同的目標,包括資料庫。在這個示例中,我將詳細介紹如何使用Microsoft.Extensions.Logging將日誌保存到MySQL資料庫。我們將使用Entity Framewo ...
  • chatgpt介面開發筆記3: 語音識別介面 1.文本轉語音 1、瞭解介面參數 介面地址: POST https://api.openai.com/v1/audio/speech 下麵是介面文檔描述內容: 參數: { "model": "tts-1", "input": "你好,我是饒坤,我是ter ...
  • 前面兩篇文章主要是介紹瞭如何解決高併發情況下資源爭奪的問題。但是現實的應用場景中除了要解決資源爭奪問題,高併發的情況還需要解決更多問題,比如快速處理業務數據等, 本篇文章簡要羅列一下與之相關的更多技術細節。 1、非同步編程:使用async和await關鍵字進行非同步編程,這可以避免阻塞線程,提高程式的響 ...
  • 大家好,我是棧長。 Nacos 2.3.0 前幾天正式發佈了,新增了不少實用性的新功能,真是史上最強版本。 Nacos 2.3.0 還真是一個比較重要的大版本,因為它涉及了太多重大更新,今天棧長給大家來解讀下。 Nacos 先掃個盲: Nacos 一個用於構建雲原生應用的動態服務發現、配置管理和服務 ...
  • IDEA的遠程開發功能,可以將本地的編譯、構建、調試、運行等工作都放在遠程伺服器上執行,而本地僅運行客戶端軟體進行常規的開發操作即可,舊版本IDEA目前不支持該功能.,本例使用的是IDEA2023.2.5版本 下麵介紹如何在IDEA中設置遠程連接伺服器開發環境並結合Cpolar內網穿透工具實現無公網 ...
  • 本文解釋為啥會有響應式編程,為什麼它在開發者中不太受歡迎,以及引入 Java 虛擬線程後它可能最終會消失。 命令式風格編程一直深受開發者喜愛,如 if-then-else、while 迴圈、函數和代碼塊等結構使代碼易理解、調試,異常易追蹤。然而,像所有好的東西一樣,通常也有問題。這種編程風格導致線程 ...