首页 > 解决方案 > 转换 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# 中做到这一点,这样,在编译时,我可以保证列表的类型不可为空,并且它不包含空值?

dotnetfiddle

理想情况下,我希望以通用方式执行此操作(但我有一个单独的问题)。

我设法找到了这个问题,它提供了一种通过将空值转换为类型的值来转换值的好方法。

有没有办法做到这一点?

标签: c#

解决方案


您可以使用.Value

IEnumerable<int> xs3 = xs.Where(x => x != null).Select(x => x.Value);

推荐阅读