【发布时间】:2021-02-04 00:21:48
【问题描述】:
我希望能够获取可空类型 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# 中做到这一点,这样,在编译时,我可以保证列表的类型不可为空,并且它不包含空值?
理想情况下,我希望以通用方式执行此操作(但我有一个单独的问题)。
我设法找到了this question,它提供了一种通过将空值转换为类型值来转换值的好方法。
有没有办法做到这一点?
【问题讨论】:
-
执行此操作的规范方法是
.Cast<int>()(或一般情况下的.Cast<T>())。但是,这只是您的Select的语法糖,所以我不确定您是否将其视为答案。 -
一个简单的
xs.OfType<int>();? -
@Ralf 是的!完美解决,不知道有没有
-
@Heinzi
.Cast<int>()在遇到null时会抛出。有时这正是你想要的,但它会改变这里的行为 -
@AluanHaddad:我的意思是
Cast是Select的替代品,即.Where(x => x != null).Cast<int>()。 Ralf 完全正确,当然,OfType更加简洁。
标签: c#