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

C# 有没有更有效的方法来创建相同的列表?,c#,.net,C#,.net,我有一系列实现数据表的列表和类。基本类是:列、行和单元格。这些行包含一些ID信息和单元格列表,其中包含每列的行值。目前,我使用如下代码在单元格中创建行 void CreateRow() { Row newRow = new Row(); newRow.ID = idInfo; foreach (var Column in Columns) { newRow.Cells.Add(new Cell(Column.ID));

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

有什么想法吗

谢谢


杰瑞:专栏不是收藏吗

var Ids = Columns.Select(c => c.Id).ToArray();
var Names = Columns.Select(c => c.Name).ToArray();
除非列已经是集合,否则为什么要这样做?因为您可以执行
列[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); 
Row newRow=新行();
newRow.ID=idInfo;
//假定单元格是一个列表
newRow.Cells.AddRange(Columns.Select(c=>newcell(c.Id));
行。添加(newRow);

目前,您为矩阵中的每个位置创建了唯一的
单元格
对象-考虑到您的用例为20.000多行,这是很多单元格

一种更有效的方法是,在构建矩阵时根本不添加单元格,而只是在尝试获取或设置其值时(即使用
惰性

假设您在检索某个单元格之前设置了该单元格的值,则可以使用工厂方法创建具有值的单元格-使
单元格
对象不可变,并且当您“创建”一个已具有相同值的另一个单元格的
单元格时,请返回该单元格。这可以显著减少
单元格
对象的总数,当然会有更多的开销,因为您需要检查是否已经有相同值的单元格,如果需要更新单元格的值,则需要再次调用factory方法

如果您当前的方法没有遇到任何内存/性能问题,那么所有这些都是不值得的-在这里衡量性能是关键。

一些建议(取决于您正在寻找的内容)

  • 考虑使用(强类型)数据集/数据表

  • 如果使用列表并且您知道其大小,请设置容量以避免重新分配(新列表(2000))

  • 如果有意义,请使用struct而不是class

  • 缓存有意义的对象(而不是反复复制同一对象)


无论如何,您都在创建单元格。所以我想问题是指什么时候用它们的值填充单元格,这些值总是在所有行的每一列中

  • 实际上,我认为从正确性的角度来看,复制数据是有意义的,因为它们实际上是相同数据的独立实例

  • 这就是说,如果它不是真正的数据,但您只想为每一行显示一个具有相同值的视图列,并且您只想将其作为数据列以方便将其显示为视图列,那么在您的属性get
    row.Cells(Id)
    中,您可以检查Id,如果它是值始终相同的列之一,返回该值,绕过查找
    \u单元格
    集合

  • 如果数据基本相同,有时不同,则可能需要使用“默认值”,如果单元格对象不存在,则将返回该列的默认值。但是,如果您希望避免在默认位置使用Cell对象,则必须在行上使用
    GetValue()
    方法

  • 如果你不在乎#1,你真的可以为任何值创建一个实例,并在你的
    单元格
    的值中引用它。对于值类型来说,这比引用类型(定义)更难做到,但这是可以做到的

  • 最后,您是否有任何理由不使用.NET提供的
    DataTable
    DataRow
    类型?我敢肯定,这些极客们在这些程序中尽可能地提高了效率


  • 什么是
    ?我从未见过它。如果您在第行中键入F12,您将使用什么名称空间?整个表是否可以是某个
    值类型的二维数组?如果你的情况有可能的话,这肯定会很有效。你能把你的每门课都发出来吗?可能有助于澄清问题。@hunter抱歉,伙计,我没有-我们只是按照同样的思路思考。是的,如果你注意到我使用的AddRange不是直接放置到单元格中。我使用的是他的代码和我的AddRange的副本,而不是foreach,这是他想要的-一种快速列出列表的方法。当然,任何一种方法都有效-老实说,我在编辑后才看到你的代码,我的编辑除了
    列之外与你的完全不同。选择(c=>newcell(c.Id))
    这与我已有的代码非常一致。我忘了提到我使用Silverlight,没有数据集/数据表