c#将不同类型的数据存储到一起的实现

 更新时间:2025年07月17日 08:32:32   作者:张謹礧  
在C#中存储不同类型的数据有多种方式,本文主要介绍了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];

优点:简单直接,无需额外类型定义。

缺点:

  • 装箱 / 拆箱开销:值类型(如 intDateTime)频繁转换会降低性能。
  • 类型不安全:运行时可能抛出 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. 使用 Tuple 或 ValueTuple

适合临时存储少量不同类型的数据。

// 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"

优点:

  • 语法简洁,像普通对象一样访问属性。
  • 无需提前定义类型。

缺点:

  • 编译时无类型检查,易出错。
  • 性能略低于静态类型。

8.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

到此这篇关于c#将不同类型的数据存储到一起的实现的文章就介绍到这了,更多相关c#不同类型数据存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C# 3DES加密详解

    C# 3DES加密详解

    3Des对每个数据块进行了三次的DES加密算法,是DES的一个更安全的变形。比起最初的DES,3DES更为安全。下面我们来看下在C#中的3DES加密方式的使用
    2015-06-06
  • C#拼图游戏编写代码

    C#拼图游戏编写代码

    这篇文章主要为大家详细介绍了C#拼图游戏的编写代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • C# 设置Chart的X轴为时间轴​​​​​​​详情

    C# 设置Chart的X轴为时间轴​​​​​​​详情

    这篇文章主要介绍了C#设置Chart的X轴为时间轴​​​​​​​详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 一文带你了解C#中抽象方法与虚方法的区别

    一文带你了解C#中抽象方法与虚方法的区别

    这篇文章主要通过简单的示例为大家详细介绍一下C#中抽象方法与虚方法的区别,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • C#使用RabbitMQ的详细教程

    C#使用RabbitMQ的详细教程

    RabbitMQ 是一个功能强大的消息队列系统,可用于在分布式系统中进行可靠的消息传递,本篇博客将详细介绍如何在 C# 中使用 RabbitMQ 实现各种消息队列操作,并通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • C#实现中文录音文件转为文本文字

    C#实现中文录音文件转为文本文字

    这篇文章主要为大家详细介绍了C#如何实现把中文录音文件(.mp3 .wav)转为文本文字内容,文中的示例代码讲解详细,感兴趣的小伙伴可以参考下
    2024-12-12
  • C#实现在Excel中添加筛选器并执行筛选的操作

    C#实现在Excel中添加筛选器并执行筛选的操作

    自动筛选器是 Excel 中的一个基本但极其有用的功能,它可以让你根据特定的条件来自动隐藏和显示你的数据,当有大量的数据需要处理时,这个功能可以帮你快速找到你需要的信息,下面将介绍如何使用免费.NET Excel库在Excel中添加、应用和删除自动筛选器,需要的朋友可以参考下
    2024-05-05
  • Unity3D开发实战之五子棋游戏

    Unity3D开发实战之五子棋游戏

    这篇文章主要为大家详细介绍了Unity3D开发实战之五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • C#遍历系统进程的方法

    C#遍历系统进程的方法

    这篇文章主要介绍了C#遍历系统进程的方法,涉及C#底层操作获取系统信息与硬件信息的相关技巧,需要的朋友可以参考下
    2015-05-05
  • C# 串口扫描枪读取数据的实现

    C# 串口扫描枪读取数据的实现

    本文主要介绍了C# 串口扫描枪读取数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04

最新评论