有没有更有效的方法来创建相同的列表?

时间:2011-04-08 00:22:18

标签: c# .net

我有一系列实现数据表的列表和类。基本类是:列,行和单元格。行包含一些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多列。所以我想知道是否有更有效的方法来填充单元格,因为每行中某列的单元格是相同的。

有什么想法吗?

谢谢,

杰里

4 个答案:

答案 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)

无论如何,你正在创建细胞。所以我认为问题是指你何时用它们的值填充单元格,这些值总是在所有行的每列中。

  1. 我实际上认为从正确的角度来看,重复数据是有意义的,因为它们实际上是相同数据的单独实例。

  2. 也就是说,如果它不是真正的数据,但你只想显示每行具有相同值的视图列,并且你只想将它作为数据列,以便将其显示为视图列,然后在您的属性 - 获取Row.Cells(Id)中,您可以检查ID,如果它是值始终相同的列之一,则返回该值,绕过查找_Cells集合。

  3. 如果数据大多数相同且有时不同,您可能需要使用“默认值”,如果Cell对象不存在,则该列的默认值为回。但是,如果要避免将Cell对象完全放在默认位置,则必须在行上使用GetValue()方法。

  4. 如果您不关心#1,您实际上可以创建任何值的单个实例,并在Cell的值中引用它。对于值类型而言,这比参考类型(定义{{​​3}})更难做,但可以这样做。

  5. 最后,您是否有任何理由不使用.NET提供的DataTableDataRow类型?我确信MS极客的编程效率和他们的效率一样多。