2014-11-24 93 views
1

我用下面的代碼得到了Excel工作表的第一行。如何在system.array中保留null - C#?

Excel.Range firstRow = ws.UsedRange.Rows[1]; 
var row = (System.Array) firstRow.Cells.Value; 
List<object> Array = row.OfType<object>().ToList(); 

row由空值組成。

例如, enter image description here

問題是當它被轉換爲列表時,所有的空值都會丟失。 (在此之後的語句)

List<object> Array = row.OfType<object>().ToList(); 

EG。 enter image description here

任何想法如何防止這種情況發生?

+0

@TimSchmelter:爲了清晰起見更新:) – 2014-11-24 13:00:40

+0

@Chris:更新爲正確的代碼片段。 – 2014-11-24 13:07:03

回答

5

從看你在做什麼Cast會比OfType更合適。

List<object> Array = myvalues.Cast<object>().ToList(); 

這應該做你想做的事情,基本上只是告訴它,所有的對象應該被轉換爲類型對象。這將保留null。

不同之處在於OfType在返回鑄造對象之前檢查current is TResult,當然null is object將返回false並因此被丟棄。這樣做的必然結果當然是Cast可以拋出異常,如果使用不當(如Cast<int>在上面的示例將拋出一個InvalidCastExceptionOfType<int>只會返回一個可以轉換爲整數的項目

來自:CAST AND OFTYPE

還有一個重要的情況下,考慮在哪裏演員將成功 返回值,OfType會忽略它:空引用(用 爲空的返回類型)在正常的代碼,你可以施展任何nullabl空引用 。 e類型(無論是參考類型還是空值 值類型)。但是,如果使用值爲「0」的「is」C#運算符,它將始終返回false。 Cast和OfType基本上遵循相同的 規則。

+0

但是如果'object'是'System.Object',他也可以使用'OfType',因爲所有東西都是從它繼承的。那麼,[不太一切(http://blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx)。 – 2014-11-24 13:11:46

+0

@TimSchmelter除了使用'OfType'時無法確定'null'的類型,因此省略。 – aevitas 2014-11-24 13:13:28

+1

@TimSchmelter:但是整個的一點是,'OfType'是消除他的空,而'Cast'不... – Chris 2014-11-24 13:13:43