c#如何將不同類型的數據存儲到一起

在 C# 中,存儲不同類型的數據有多種方式,具體選擇取決于你的需求(類型安全、性能、靈活性等)。以下是常見的解決方案及其適用場景:

1. 使用 object 類型(裝箱 / 拆箱)

將所有數據轉換為基類 object,利用 C# 的多態性存儲任意類型。

List<object> mixedList = new List<object>();
mixedList.Add(123); ? ? ? ? ? ?// int → 裝箱為object
mixedList.Add("Hello"); ? ? ? ?// string(引用類型無需裝箱)
mixedList.Add(new DateTime()); // DateTime → 裝箱為object
?
// 訪問時需手動拆箱(可能引發InvalidCastException)
int num = (int)mixedList[0]; ? // 拆箱
string str = (string)mixedList[1];
  • 優點:簡單直接,無需額外類型定義。

  • 缺點:

    • 裝箱 / 拆箱開銷:值類型(如 int, DateTime)頻繁轉換會降低性能。

    • 類型不安全:運行時可能拋出 InvalidCastException

2. 使用泛型集合 List<dynamic>

dynamic 關鍵字在運行時動態解析類型,避免編譯時類型檢查。List<dynamic> dynamicList = new List<dynamic>();
dynamicList.Add(123); ? ? ? ?// 無需裝箱
dynamicList.Add("Hello");
dynamicList.Add(new { Name = "Alice" }); // 匿名類型也可存儲
?
// 訪問時無需顯式轉換
int num = dynamicList[0]; ? ?// 動態類型解析
string str = dynamicList[1];
  • 優點:

    • 無需裝箱拆箱(值類型以原始類型存儲)。

    • 支持匿名類型等復雜結構。

  • 缺點:

    • 運行時類型風險:若類型不匹配會在運行時拋出異常。

    • 性能開銷:動態解析比靜態類型稍慢。

3. 使用自定義類 / 結構體(推薦方案)

public class MixedData
{public int Id { get; set; }public string Name { get; set; }public DateTime BirthDate { get; set; }
}
?
// 使用方式
List<MixedData> dataList = new List<MixedData>();
dataList.Add(new MixedData { Id = 1, Name = "Alice", BirthDate = DateTime.Now 
});

定義一個包含所需字段的類,每個字段使用明確的類型。

public class MixedData
{public int Id { get; set; }public string Name { get; set; }public DateTime BirthDate { get; set; }
}
?
// 使用方式
List<MixedData> dataList = new List<MixedData>();
dataList.Add(new MixedData { Id = 1, Name = "Alice", BirthDate = DateTime.Now 
});
  • 優點:

    • 類型安全:編譯時檢查類型。

    • 可讀性高:字段含義明確。

    • 性能最優:無需裝箱拆箱。

  • 缺點:需提前定義類型,不夠靈活。

4. 使用 TupleValueTuple

適合臨時存儲少量不同類型的數據。// Tuple(舊版,需通過Item1、Item2訪問)
var tupleList = new List<Tuple<int, string>>();
tupleList.Add(Tuple.Create(1, "Alice"));
?
// ValueTuple(C# 7.0+,推薦,支持命名元素)
var valueTupleList = new List<(int Id, string Name)>();
valueTupleList.Add((1, "Alice"));
?
// 訪問方式
int id = valueTupleList[0].Id;
string name = valueTupleList[0].Name;
  • 優點:簡潔,無需額外類定義。

  • 缺點:

    • 元素數量有限(最多 8 個)。

    • 不適合復雜或大量數據。

5. 使用 Dictionary<string, object>

以鍵值對形式存儲不同類型的值,類似動態對象。

var dict = new Dictionary<string, object>();
dict["Id"] = 123;
dict["Name"] = "Alice";
dict["IsActive"] = true;
?
// 訪問時需轉換類型
int id = (int)dict["Id"];
bool isActive = (bool)dict["IsActive"];
  • 優點:靈活,可動態添加 / 刪除鍵值對。

  • 缺點:

    • 類型不安全,需手動轉換。

    • 鍵名硬編碼,易出錯。

6. 使用接口或抽象類(面向對象設計)

定義公共接口,讓不同類型實現該接口。

public interface IDataItem { }
?
public class Person : IDataItem
{public string Name { get; set; }
}
?
public class Product : IDataItem
{public decimal Price { get; set; }
}
?
// 使用方式
List<IDataItem> items = new List<IDataItem>();
items.Add(new Person { Name = "Alice" });
items.Add(new Product { Price = 9.99m });
?
// 通過模式匹配訪問
foreach (var item in items)
{if (item is Person person)Console.WriteLine(person.Name);else if (item is Product product)Console.WriteLine(product.Price);
}
  • 優點:

    • 類型安全,符合面向對象原則。

    • 可擴展,易于添加新類型。

  • 缺點:需設計接口和繼承體系,復雜度較高。

7. 使用 ExpandoObject(動態對象)

System.Dynamic.ExpandoObject 是動態類型的字典,支持運行時添加屬性。

dynamic person = new ExpandoObject();
person.Name = "Alice";
person.Age = 30;
?
// 直接訪問屬性(無需轉換)
Console.WriteLine(person.Name); // "Alice"
  • 優點:

    • 語法簡潔,像普通對象一樣訪問屬性。

    • 無需提前定義類型。

  • 缺點:

    • 編譯時無類型檢查,易出錯。

    • 性能略低于靜態類型。

    7. ArrayList(非泛型,不推薦)

    特點

    • 來自 System.Collections 命名空間,可存儲任意類型(實際存為 object)。

    • 動態擴容,但存在裝箱 / 拆箱開銷類型安全問題

    示例

    using System.Collections;
    ?
    ArrayList list = new ArrayList();
    list.Add("張三"); ? ?// string → object(裝箱)
    list.Add(10); ? ? ? ?// int → object(裝箱)
    list.Add(2.2); ? ? ? // double → object(裝箱)
    ?
    // 訪問時需手動拆箱,可能引發InvalidCastException
    int num = (int)list[1]; // 拆箱
方案裝箱開銷類型安全性能(相對)
List<object>
List<dynamic>
自定義類 / 結構體
Dictionary<string, object>
ExpandoObject中低
ArrayList

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914654.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914654.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

超唯美治愈風卡通插畫PPT模版

海洋卡通風治愈系PPT模版&#xff0c;兒童可愛治愈可愛PPT模版&#xff0c;治愈風商務通用PPT模版&#xff0c;治愈系課件PPT模版&#xff0c;治愈風插畫PPT模版&#xff0c;超唯美治愈風PPT模版&#xff0c;可愛插畫治愈系女孩PPT模版 超唯美治愈風卡通插畫PPT模版&#xff1a…

el-tooltip 快速滾動的時候出現殘影如何解決 vue3

<el-tooltip:disabled"isScrolling" <!-- 新增滾動狀態綁定 -->:popper-options"{ modifiers: [{ name: computeStyles, options: { adaptive: false }] }"effect"dark":content"label.name"placement"right-start"…

【經典面經】C++新特性 TCP完整收發數據 TLS1.2 TLS1.3

文章目錄cpp新特性C11C14C17C20tcp如何保證完整收發數據結論1. **面向連接的三次握手**2. **字節序號與確認機制**3. **校驗和&#xff08;Checksum&#xff09;**4. **超時重傳與快速重傳**5. **滑動窗口&#xff08;流量控制&#xff09;**6. **數據重組與排序**7. **四次揮手…

Spring AI 系列之十一 - RAG-進階RetrievalAugmentationAdvisor

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

[TOOL] ubuntu 使用 ffmpeg 操作 gif、mp4

文章目錄一、工具安裝二、gif 轉mp4三、mp4 兩倍速一、工具安裝 安裝 ffmpeg 工具&#xff1a; sudo apt install ffmpeg二、gif 轉mp4 1. 配置環境 核心指令: ffmpeg -i input.mp4 -filter_complex "[0:v]setpts0.5*PTS[v];[0:a]atempo2.0[a]" -map "[v]&q…

linux中INIT_MM_CONTEXT宏對pgd的重復賦值

在GNU C中&#xff0c;支持通過標號元素對指定結構體成員名進行初始化&#xff0c;這允許初始化值以任意順序出現。在linux內核中對init_mm初始化時有如下代碼。#define INIT_MM_CONTEXT(name) \.pgd init_pg_dir,struct mm_struct init_mm {.mm_rb RB_ROOT,.pgd swapper…

第十五章 STL(stack、queue、list、set、map容器使用)

棧stack使用&#xff1a;隊列queue雙向循環鏈表listlist構造函數list 賦值和交換list 大小操作list 插入和刪除list 數據存取list 反轉和排序排序算法sort降序操作排序案例#include<iostream> using namespace std; #include<list>class Person { private:string n…

【論文閱讀】HCCF:Hypergraph Contrastive Collaborative Filtering

論文出處&#xff1a;SIGIR 2022 CCF-A 論文地址&#xff1a;Hypergraph Contrastive Collaborative Filtering 論文代碼&#xff1a;akaxlh/HCCF: HCCF, SIGIR 2022 目錄 摘要 介紹 研究背景與核心問題 現有方法局限性 HCCF的創新解決方案 技術優勢 定義與相關工作 …

Retrofit+RxJava:打造聲明式REST客戶端的藝術 —— 像點咖啡一樣調用API

目錄一、告別Callback地獄&#xff1a;聲明式編程的魅力1.1 傳統網絡請求的痛點1.2 Retrofit的聲明式革命二、Retrofit核心配置工廠2.1 構建Retrofit實例2.2 常用注解速查表三、RxJava響應式魔法3.1 鏈式調用優雅變身3.2 超能力操作符盤點四、實戰演練&#xff1a;構建天氣查詢…

【離線數倉項目】——任務調度與數據可視化實戰

摘要 本文主要圍繞離線數倉項目中的任務調度與數據可視化實戰展開&#xff0c;介紹了業務流程虛擬節點、離線數倉任務調度、數據可視化等方面的內容&#xff0c;涉及DataWorks和QuickBI等工具的使用&#xff0c;并提供了相關的博文參考和項目實戰域信息。 1. 任務調度管理實戰…

【視頻格式轉換】.264格式轉為mp4格式

背景 視頻格式轉換是多媒體處理中的常見需求&#xff0c;尤其在視頻編輯、存儲或跨平臺播放時。H.264&#xff08;即AVC&#xff09;是一種廣泛使用的視頻編碼標準&#xff0c;以其高壓縮率和良好兼容性著稱&#xff0c;但通常以容器格式&#xff08;如.264裸流文件&#xff0…

JAVA學習筆記 使用notepad++開發JAVA-003

目錄 1 前言 2 部署notepad的java開發環境 2.1 下載并安裝notepad 2.2 設置新建文件的語言 2.3 安裝NppExec插件 2.4 編寫JAVA腳本 2.5 設置腳本執行快捷鍵 2.6 效果測試 3 小結 1 前言 JAVA可以使用記事本來編寫代碼&#xff0c;但是這種方式效率十分低下。我們可以使…

Vue Router 完全指南:從入門到實戰,高效管理前端路由

前言在現代化的前端開發中&#xff0c;路由管理是構建單頁應用&#xff08;SPA&#xff09;的核心功能之一。Vue.js 作為主流的前端框架之一&#xff0c;提供了強大的官方路由庫Vue Router&#xff0c;幫助開發者高效管理頁面跳轉、動態加載、權限控制等關鍵需求。無論是構建企…

Sentinel熱點參數限流完整示例實現

Sentinel熱點參數限流完整示例實現 1. 添加Maven依賴 (pom.xml) <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2.2.7.RELEASE</version> </depend…

正則表達式深度解析:從LeetCode 3136題說起

正則表達式深度解析&#xff1a;從LeetCode 3136題說起 引言 正則表達式&#xff08;Regular Expression&#xff0c;簡稱RegEx&#xff09;是一種強大的字符串匹配工具&#xff0c;在字符串處理、數據驗證、文本搜索等場景中有著廣泛的應用。本文將以LeetCode 3136題"有效…

映美打印機-URL頁面打印

<?php /** 打印 - 映美云 https://open.jolimark.com/doc/ */ namespace Home\Controller; use Admin\Logic\OrderLogic;class PrintController extends BaseController {private $appid "";private $appkey "";//打印機編號private $deviceIds &qu…

機器學習算法 ——XGBoost 的介紹和使用

前言&#xff1a; 最近在工作中遇到一個結構化數據回歸預測的問題&#xff0c;用到了很多回歸算法&#xff08;如多元線性回歸等&#xff09;都沒有很好的效果&#xff0c;于是使用了XGBoost&#xff0c;自己也沖三個特征參數人為的增加來幾個&#xff0c;訓練出來的效果還是很…

Linux操作系統之信號:保存與處理信號

目錄 前言&#xff1a; 前文回顧與補充&#xff1a; 信號的保存 PCB里的信號保存 sigset_t 信號集操作函數 信號的處理 信號捕捉的流程&#xff1a;?編輯 操作系統的運行原理 硬件中斷 時鐘中斷 死循環 軟中斷 總結&#xff1a; 前言&#xff1a; 在上一篇文…

Spring Boot 設置滾動日志logback

Spring Boot 的 logback 框架 Spring Boot 默認內置了 Logback 作為日志實現框架&#xff0c;只需要在resources文件夾下添加一個logback-spring.xml&#xff0c;springboot會按照你的設置自動開啟logback日志功能。 配置 logback-spring.xml 實現每天產生一個日志文件&#xf…

如何定義一個只能在堆上或棧上生成對象的類

在C中&#xff0c;可以通過特定的技術手段來控制對象只能在堆(heap)或棧(stack)上創建。只能在堆上創建對象的類要實現這一點&#xff0c;我們需要阻止用戶直接實例化對象&#xff0c;而只能通過new操作符創建。class HeapOnly { public:static HeapOnly* create() {return new…