c# - 转换 IEnumerable到 IEnumerable
问题描述
我希望能够获取可空类型 T? 的列表,并删除任何空值,留下 T 类型。例如:
List<int?> xs = new List<int?>() {1, 2, 3};
// this method works
IEnumerable<int> xs2 = xs.Select(x => x ?? 0);
// this method does not
IEnumerable<int> xs3 = xs.Where(x => x != null);
我很欣赏 C# 无法推断列表的类型,以便能够判断列表中没有空值。但我正在努力寻找最好的方法来做到这一点,而不仅仅是做一个明确的演员,如:
IEnumerable<int> xs3 = xs.Where(x => x != null).Select(x => (int)x);
我遇到的问题是,如果该Where
语句不存在,那么代码仍然会通过类型检查,但会出现运行时错误。有没有办法在 C# 中做到这一点,这样,在编译时,我可以保证列表的类型不可为空,并且它不包含空值?
理想情况下,我希望以通用方式执行此操作(但我有一个单独的问题)。
我设法找到了这个问题,它提供了一种通过将空值转换为类型的值来转换值的好方法。
有没有办法做到这一点?
解决方案
您可以使用.Value
:
IEnumerable<int> xs3 = xs.Where(x => x != null).Select(x => x.Value);
推荐阅读
- python - 如何创建一个包含两个不同查询集的表
- html - 锚标记内图像的焦点边界半径
- node.js - 使用 mocha chai 测试 node.js 中抛出的错误
- here-api - LinkId 未找到但由 calculateroute.json 返回
- ruby-on-rails - rails 4 deep_clone 在开发/登台和生产方面不同
- apache-spark - 无法在已停止的 SparkContext 上调用方法。这个停止的 SparkContext 创建于
- r - 如何在基础 R 中为某些变量指定颜色
- python - 如何从第二个数据集中的列中为每个人计算最新值?
- c# - 以编程方式将新列添加到 DataGridView(填充有 DataTable 的 DataGridview)
- javascript - JavaScript 条件量角器测试