1

我得到了带有以下代码的 excel 表的第一行。

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

row由空值组成。

例如。在此处输入图像描述

问题是当它转换为列表时,所有空值都丢失了。 (在此声明之后)

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

例如。在此处输入图像描述

任何想法如何防止这种情况发生?

4

1 回答 1

5

从你正在做的事情来看Cast会比OfType.

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

这应该做你想做的,基本上只是告诉它所有对象都应该被转换为类型对象。这将保留空值。

差异的原因是在返回转换对象之前OfType进行检查current is TResult,当然null is object会返回 false,因此它会被丢弃。这样的必然结果当然是Cast如果被滥用会抛出异常(例如Cast<int>,在上面的示例中会抛出一个InvalidCastExceptionwhileOfType<int>只会返回可以转换为整数的项目。

来自: CAST AND OFTYPE

有一个重要的案例需要考虑 Cast 将在哪里成功返回一个值而 OfType 将忽略它:空引用(具有可为空的返回类型)。在普通代码中,您可以将空引用强制转换为任何可空类型(无论是引用类型还是可空值类型)。但是,如果使用带有 null 值的“is”C# 运算符,它将始终返回 false。Cast 和 OfType 基本上遵循相同的规则。

于 2014-11-24T13:06:56.950 回答