如何在 system.array - C# 中保留 null?

Posted

技术标签:

【中文标题】如何在 system.array - C# 中保留 null?【英文标题】:How to preserve null in system.array - C#? 【发布时间】:2015-01-22 04:45:58 【问题描述】:

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

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

row 由空值组成。

例如。

问题是转换成list的时候,所有的null值都丢失了。 (在此声明之后)

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

例如。

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

【问题讨论】:

@TimSchmelter:为清晰起见已更新 :) @Chris:已更新为正确的 code-sn-p。 【参考方案1】:

看看你在做什么Cast会比OfType更合适。

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

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

差异的原因是OfType 在返回转换对象之前检查current is TResult,当然null is object 将返回false,因此它被丢弃。这样的推论当然是Cast 可以在滥用时抛出异常(例如,上面示例中的Cast&lt;int&gt; 会抛出InvalidCastExceptionOfType&lt;int&gt; 只会返回可以转换为整数的项目。

发件人: CAST AND OFTYPE

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

【讨论】:

但如果objectSystem.Object 他也可以使用OfType,因为一切都继承自它。好吧,not quite everything. @TimSchmelter 除了null的类型在使用OfType时无法确定,因此省略。 @TimSchmelter:但重点是 OfType 正在删除他的 null 而 Cast 没有... @Chris:我不知道。学到了一些新东西:) 为什么会这样? @TimSchmelter:在注释中添加。基本上Cast 不会在强制转换之前检查类型(所以如果你不小心会返回强制转换异常),而OfType 会检查 null 不同意的类型。当我能教一个拥有超过 180,000 名代表的人时,它总是很好。 ;-)

以上是关于如何在 system.array - C# 中保留 null?的主要内容,如果未能解决你的问题,请参考以下文章

在 ASMX C# Web 服务中使用 System.Array 类型的参数定义函数

C# 遍历枚举? (索引 System.Array)

c# System.Array

c#中array.sort()用法

System.Array' 不包含 'Count' 的定义

C#中如何只保留小数点后面两位?