c#將不同類型的數(shù)據(jù)存儲(chǔ)到一起的實(shí)現(xiàn)
在 C# 中,存儲(chǔ)不同類型的數(shù)據(jù)有多種方式,具體選擇取決于你的需求(類型安全、性能、靈活性等)。以下是常見的解決方案及其適用場(chǎng)景:
1. 使用 object 類型(裝箱 / 拆箱)
將所有數(shù)據(jù)轉(zhuǎn)換為基類 object
,利用 C# 的多態(tài)性存儲(chǔ)任意類型。
List<object> mixedList = new List<object>(); mixedList.Add(123); // int → 裝箱為object mixedList.Add("Hello"); // string(引用類型無需裝箱) mixedList.Add(new DateTime()); // DateTime → 裝箱為object // 訪問時(shí)需手動(dòng)拆箱(可能引發(fā)InvalidCastException) int num = (int)mixedList[0]; // 拆箱 string str = (string)mixedList[1];
優(yōu)點(diǎn):簡(jiǎn)單直接,無需額外類型定義。
缺點(diǎn):
- 裝箱 / 拆箱開銷:值類型(如
int
,DateTime
)頻繁轉(zhuǎn)換會(huì)降低性能。 - 類型不安全:運(yùn)行時(shí)可能拋出
InvalidCastException
。
2. 使用泛型集合 List<dynamic>
dynamic 關(guān)鍵字在運(yùn)行時(shí)動(dòng)態(tài)解析類型,避免編譯時(shí)類型檢查。 List<dynamic> dynamicList = new List<dynamic>(); dynamicList.Add(123); // 無需裝箱 dynamicList.Add("Hello"); dynamicList.Add(new { Name = "Alice" }); // 匿名類型也可存儲(chǔ) // 訪問時(shí)無需顯式轉(zhuǎn)換 int num = dynamicList[0]; // 動(dòng)態(tài)類型解析 string str = dynamicList[1];
優(yōu)點(diǎn):
- 無需裝箱拆箱(值類型以原始類型存儲(chǔ))。
- 支持匿名類型等復(fù)雜結(jié)構(gòu)。
缺點(diǎn):
- 運(yùn)行時(shí)類型風(fēng)險(xiǎn):若類型不匹配會(huì)在運(yùn)行時(shí)拋出異常。
- 性能開銷:動(dòng)態(tài)解析比靜態(tài)類型稍慢。
3. 使用自定義類 / 結(jié)構(gòu)體(推薦方案)
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 });
定義一個(gè)包含所需字段的類,每個(gè)字段使用明確的類型。
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 });
優(yōu)點(diǎn):
- 類型安全:編譯時(shí)檢查類型。
- 可讀性高:字段含義明確。
- 性能最優(yōu):無需裝箱拆箱。
缺點(diǎn):需提前定義類型,不夠靈活。
4. 使用 Tuple 或 ValueTuple
適合臨時(shí)存儲(chǔ)少量不同類型的數(shù)據(jù)。 // 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;
優(yōu)點(diǎn):簡(jiǎn)潔,無需額外類定義。
缺點(diǎn):
- 元素?cái)?shù)量有限(最多 8 個(gè))。
- 不適合復(fù)雜或大量數(shù)據(jù)。
5. 使用 Dictionary<string, object>
以鍵值對(duì)形式存儲(chǔ)不同類型的值,類似動(dòng)態(tài)對(duì)象。
var dict = new Dictionary<string, object>(); dict["Id"] = 123; dict["Name"] = "Alice"; dict["IsActive"] = true; ? // 訪問時(shí)需轉(zhuǎn)換類型 int id = (int)dict["Id"]; bool isActive = (bool)dict["IsActive"];
優(yōu)點(diǎn):靈活,可動(dòng)態(tài)添加 / 刪除鍵值對(duì)。
缺點(diǎn):
- 類型不安全,需手動(dòng)轉(zhuǎn)換。
- 鍵名硬編碼,易出錯(cuò)。
6. 使用接口或抽象類(面向?qū)ο笤O(shè)計(jì))
定義公共接口,讓不同類型實(shí)現(xiàn)該接口。
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); }
優(yōu)點(diǎn):
- 類型安全,符合面向?qū)ο笤瓌t。
- 可擴(kuò)展,易于添加新類型。
缺點(diǎn):需設(shè)計(jì)接口和繼承體系,復(fù)雜度較高。
7. 使用 ExpandoObject(動(dòng)態(tài)對(duì)象)
System.Dynamic.ExpandoObject
是動(dòng)態(tài)類型的字典,支持運(yùn)行時(shí)添加屬性。
dynamic person = new ExpandoObject(); person.Name = "Alice"; person.Age = 30; ? // 直接訪問屬性(無需轉(zhuǎn)換) Console.WriteLine(person.Name); // "Alice"
優(yōu)點(diǎn):
- 語法簡(jiǎn)潔,像普通對(duì)象一樣訪問屬性。
- 無需提前定義類型。
缺點(diǎn):
- 編譯時(shí)無類型檢查,易出錯(cuò)。
- 性能略低于靜態(tài)類型。
8.ArrayList(非泛型,不推薦)
特點(diǎn):
- 來自
System.Collections
命名空間,可存儲(chǔ)任意類型(實(shí)際存為object
)。 - 動(dòng)態(tài)擴(kuò)容,但存在裝箱 / 拆箱開銷和類型安全問題。
示例:
using System.Collections; ArrayList list = new ArrayList(); list.Add("張三"); // string → object(裝箱) list.Add(10); // int → object(裝箱) list.Add(2.2); // double → object(裝箱) // 訪問時(shí)需手動(dòng)拆箱,可能引發(fā)InvalidCastException int num = (int)list[1]; // 拆箱
方案 | 裝箱開銷 | 類型安全 | 性能(相對(duì)) |
---|---|---|---|
List<object> | 有 | 否 | 低 |
List<dynamic> | 無 | 否 | 中 |
自定義類 / 結(jié)構(gòu)體 | 無 | 是 | 高 |
Dictionary<string, object> | 有 | 否 | 中 |
ExpandoObject | 無 | 否 | 中低 |
ArrayList | 有 | 否 | 低 |
到此這篇關(guān)于c#將不同類型的數(shù)據(jù)存儲(chǔ)到一起的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c#不同類型數(shù)據(jù)存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#?設(shè)置Chart的X軸為時(shí)間軸???????詳情
這篇文章主要介紹了C#設(shè)置Chart的X軸為時(shí)間軸???????詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08C#實(shí)現(xiàn)中文錄音文件轉(zhuǎn)為文本文字
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)把中文錄音文件(.mp3 .wav)轉(zhuǎn)為文本文字內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考下2024-12-12C#實(shí)現(xiàn)在Excel中添加篩選器并執(zhí)行篩選的操作
自動(dòng)篩選器是 Excel 中的一個(gè)基本但極其有用的功能,它可以讓你根據(jù)特定的條件來自動(dòng)隱藏和顯示你的數(shù)據(jù),當(dāng)有大量的數(shù)據(jù)需要處理時(shí),這個(gè)功能可以幫你快速找到你需要的信息,下面將介紹如何使用免費(fèi).NET Excel庫在Excel中添加、應(yīng)用和刪除自動(dòng)篩選器,需要的朋友可以參考下2024-05-05Unity3D開發(fā)實(shí)戰(zhàn)之五子棋游戲
這篇文章主要為大家詳細(xì)介紹了Unity3D開發(fā)實(shí)戰(zhàn)之五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09C# 串口掃描槍讀取數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了C# 串口掃描槍讀取數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04