C#DataTable与一些通用收集性能

C#DataTable与一些通用收集性能,c#,generics,datatable,boxing,unboxing,C#,Generics,Datatable,Boxing,Unboxing,我知道在插入/获取数据时,DataTable正在使用装箱/取消装箱。例如,如果我们有大量数据只包含int,那么使用某种通用的DataTable,比如说MyDataTable,不是更快吗,这将避免装箱/拆箱开销?您需要处理的主要问题是,DataTable可以有任意数量的列,其中每列可以是任意类型的。当每个列仍具有不同的类型时,不能将其泛化 避免装箱的一种方法是创建一个对象来表示每一行,而不是使用DataTable。确保对象的每一列都具有相应类型的属性。然后可以使用这些对象的列表(或其他一些数据结构

我知道在插入/获取数据时,
DataTable
正在使用装箱/取消装箱。例如,如果我们有大量数据只包含
int
,那么使用某种通用的
DataTable
,比如说
MyDataTable
,不是更快吗,这将避免装箱/拆箱开销?

您需要处理的主要问题是,
DataTable
可以有任意数量的列,其中每列可以是任意类型的。当每个列仍具有不同的类型时,不能将其泛化

避免装箱的一种方法是创建一个对象来表示每一行,而不是使用
DataTable
。确保对象的每一列都具有相应类型的属性。然后可以使用这些对象的
列表
(或其他一些数据结构)


另一个选项,例如,如果您的数据完全具有
int
值,则可以创建一个多维int数组(
int[,]mydata=new int[10000,5];
)。这也可以避免装箱整数。

字符串是引用类型,因此没有装箱开销:它们从不装箱。不过,DataTable确实有很多开销——这是能够表示任意列模型以及约束、更改跟踪等的成本。为了获得最佳性能,POCO模型很难被打败。例如:

public class Customer {
    public int Id { get; set; }
    public string Name { get; set; }
    // ...
}
有很多orm和micro-orm可以使用这种类型的模型

但是,请注意,在DataTable中,值存储在正确类型的数组中。int存储在int[]中,这是通过将数据存储在列而不是行中实现的。装箱仅在将数据放入/移出数据表时发生