2011-04-08 71 views
1

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

任何想法?

感谢,

杰里

+0

什么是行?我从来没有遇到它。如果你在Row上键入F12,它会带你到什么名字空间? – 2011-04-08 00:29:43

+0

整个表格可以是某个“ValueType”的二维数组吗?如果在你的情况下是可能的,它肯定会很有效。 – 2011-04-08 00:31:09

+0

你可以发布你的每个类吗?可能有助于澄清事情。 – hunter 2011-04-08 00:46:28

回答

0

是不是列的集合?

var Ids = Columns.Select(c => c.Id).ToArray(); 
var Names = Columns.Select(c => c.Name).ToArray(); 

等。除非为什么如果列已经是一个集合?对于你可以做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); 
+0

@猎人对不起,我没有 - 我们只是想着同样的观点。 – 2011-04-08 00:46:29

+0

是的,如果你注意到我正在使用AddRange而不是直接放置到单元格中。我使用他的代码和我的AddRange的副本而不是foreach,这是他想要的 - 一种快速列表的方法。 – 2011-04-08 00:49:43

+0

无论哪种方式当然是作品 - 老实说,我没有看到你的代码,直到编辑后,我的编辑看起来没有像你的'Columns.Select(c =>新的单元格(c.Id))''这是非常与我已有的代码一致。 – 2011-04-08 00:52:50

2

目前你创建你的矩阵中的每个位置独特Cell对象 - 这是给定的20.000您的使用案例很多细胞+行。

一种更高效的方法可能是在构建矩阵时根本不添加单元格,但只有在尝试获取或设置其值时(即使用Lazy<T>)才能添加单元格。

假设你设置取回前一个单元格的值,然后你可以有一个工厂方法来创建一个值的单元格 - 使Cell对象不变,当你“创造”一个Cell为您已经有另一个具有相同值的单元格,而是返回该单元格。这可能会显着减少对象的总数,当然由于您需要检查是否已经有相同值的单元格,并且需要更新单元格的值时需要再次调用工厂方法,所以开销更大。

如果您没有遇到任何内存/性能问题,那么所有这些都不值得,因为测量性能是关键。

+0

+1用于提及使用延迟加载。 – FreeAsInBeer 2011-04-08 00:48:14

0

一些建议(取决于你在找什么)

  • 考虑使用(强类型)的DataSet/DataTable中

  • 如果使用列表,你知道的大小,设置,以避免产能重新分配(新名单(2000))

  • 使用结构,而不是类,如果它是有道理的

  • 缓存对象(如果有意义的话)(而不是一遍一遍地复制同一对象)

+0

我忘了提到我使用Silverlight,没有DataSet/DataTabe – JerryKur 2011-04-08 02:15:43

0

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

  1. 我实际上认为,从正确性的角度来看,重复数据是有意义的,因为它们实际上是相同数据的单独实例。这就是说,如果它不是真正的数据,但你只是想显示一个视图列与每行相同的值,你只是希望它作为一个数据列,以便轻松显示它作为一个数据列然后在你的财产 - 得到Row.Cells(Id)你可以检查ID,如果它是其中一个值总是相同的列,返回该值,绕过查找您的_Cells集合。

  2. 如果数据大多相同,有时是不同的,你可能需要使用“默认值”,其中如果单元格对象不存在,将返回该列的默认值。这需要在行上使用GetValue()方法,但是,如果您希望避免将Cell对象放在默认位置。

  3. 如果你不关心#1,你真的可以做一个单一的任何值的实例,并引用它在你的Cell的值。值类型比参考类型(定义here)要难,但可以完成。

  4. 最后,有没有你不使用.NET的供应DataTableDataRow类型的原因吗?我相信MS极客编程的效率尽可能高。

相关问题