我有一系列实现数据表的列表和类。基本类是:列,行和单元格。行包含一些ID信息和单元格列表,其中包含每列的行值。目前,我使用类似
的代码在单元格中创建行void CreateRow()
{
Row newRow = new Row();
newRow.ID = idInfo;
foreach (var Column in Columns)
{
newRow.Cells.Add(new Cell(Column.ID));
}
Rows.Add(newRow);
}
工作正常,但在某些情况下我调用了CreateRow()20,000次,并且有200多列。所以我想知道是否有更有效的方法来填充单元格,因为每行中某列的单元格是相同的。
有什么想法吗?
谢谢,
杰里
答案 0 :(得分:2)
目前,您为矩阵中的每个位置创建了唯一的Cell
对象 - 根据您的用例为20.000 +行,这是很多单元格。
更有效的一种方法可能是在构造矩阵时根本不添加单元格,但只有当您尝试获取或设置其值时(即使用Lazy<T>
)。
假设你在检索之前设置一个单元格的值,那么你就可以有一个工厂方法来创建一个带有值的单元格 - 使Cell
对象不可变,当你是“创建”Cell
已经有另一个具有相同值的单元格,而是返回该单元格。这可能会显着减少Cell
个对象的总数,当然还有更多的开销,因为您需要检查是否已经有一个具有相同值的单元格,如果需要更新值,则需要再次调用工厂方法细胞。
如果您在当前的方法中没有遇到任何内存/性能问题,那么所有这些都不值得 - 测量性能是关键。
答案 1 :(得分:0)
列不是集合吗?
var Ids = Columns.Select(c => c.Id).ToArray();
var Names = Columns.Select(c => c.Name).ToArray();
等。如果Columns已经是一个集合,为什么会这样做呢?你可以做Columns[index].Id
或者如果您必须拥有您概述的代码:
Row newRow = new Row();
newRow.ID = idInfo;
// presuming Cells is a List<>
newRow.Cells.AddRange(Columns.Select(c => new Cell(c.Id)));
Rows.Add(newRow);
答案 2 :(得分:0)
一些建议(取决于您要找的内容)
考虑使用(强类型)DataSet / DataTable
如果使用List并且您知道大小,请设置容量以避免重新分配(新列表(2000))
如果有意义,请使用struct而不是class
如果有意义的话,请缓存对象(而不是一遍又一遍地复制同一个对象)
答案 3 :(得分:0)
无论如何,你正在创建细胞。所以我认为问题是指你何时用它们的值填充单元格,这些值总是在所有行的每列中。
我实际上认为从正确的角度来看,重复数据是有意义的,因为它们实际上是相同数据的单独实例。
也就是说,如果它不是真正的数据,但你只想显示每行具有相同值的视图列,并且你只想将它作为数据列,以便将其显示为视图列,然后在您的属性 - 获取Row.Cells(Id)
中,您可以检查ID,如果它是值始终相同的列之一,则返回该值,绕过查找_Cells
集合。
如果数据大多数相同且有时不同,您可能需要使用“默认值”,如果Cell对象不存在,则该列的默认值为回。但是,如果要避免将Cell对象完全放在默认位置,则必须在行上使用GetValue()
方法。
如果您不关心#1,您实际上可以创建任何值的单个实例,并在Cell
的值中引用它。对于值类型而言,这比参考类型(定义{{3}})更难做,但可以这样做。
最后,您是否有任何理由不使用.NET提供的DataTable
和DataRow
类型?我确信MS极客的编程效率和他们的效率一样多。