2011-04-08 41 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極客編程的效率儘可能高。

相關問題