Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换IEnumerable<;T?>;到IEnumerable<;T>;_C# - Fatal编程技术网

C# 转换IEnumerable<;T?>;到IEnumerable<;T>;

C# 转换IEnumerable<;T?>;到IEnumerable<;T>;,c#,C#,我希望能够获取一个可为空类型T?的列表,并删除任何空值,留下一个类型T。例如: List xs=newlist(){1,2,3}; //这种方法有效 IEnumerable xs2=xs.Select(x=>x??0); //这种方法不适用 IEnumerable xs3=xs.Where(x=>x!=null); 我很感激C#无法推断列表的类型,这样它就能够判断列表中没有空值。但我正在努力找到最好的方式来做到这一点,而不只是做一个明确的演员阵容,如: IEnumerable xs3=xs.W

我希望能够获取一个可为空类型T?的列表,并删除任何空值,留下一个类型T。例如:

List xs=newlist(){1,2,3};
//这种方法有效
IEnumerable xs2=xs.Select(x=>x??0);
//这种方法不适用
IEnumerable xs3=xs.Where(x=>x!=null);
我很感激C#无法推断列表的类型,这样它就能够判断列表中没有空值。但我正在努力找到最好的方式来做到这一点,而不只是做一个明确的演员阵容,如:

IEnumerable xs3=xs.Where(x=>x!=null)。选择(x=>(int)x);
我遇到的问题是,如果
Where
语句不存在,那么代码仍然会通过类型检查,但会出现运行时错误。有没有办法在C#中做到这一点,这样在编译时,我可以保证列表的类型不可为null,并且不包含null

理想情况下,我希望以一种通用的方式来做这件事(但我有一个单独的问题)

我通过将空值转换为该类型的值,找到了转换值的好方法

有办法做到这一点吗?

您可以使用:

IEnumerable xs3=xs.Where(x=>x!=null)。选择(x=>x.Value);

实现这一点的标准方法是
.Cast()
(或者在一般情况下是
.Cast()
)。然而,这只是
Select
的语法糖,所以我不确定您是否将其作为答案?@Ralf是的!完美地解决了它,我不知道existed@Heinzi
.Cast()
如果遇到
null
将抛出。有时这正是你想要的,但它会改变你的行为here@AluanHaddad:我的意思是将
Cast
替换为
Select
,即
。其中(x=>x!=null)。Cast()
。Ralf是完全正确的,当然,
of type
更简洁。感谢您的回答-我相信
of type
在这种情况下提供了更好的解决方案,因为使用
值进行选择
似乎仍然会在运行时出现空值异常(请注意,在这个示例中,我已经过滤掉了空值,我真的很喜欢
of type
,因为它不依赖于已经同时过滤掉的空值)因为前面的
x!=null
过滤器,
.Value
保证会成功。除了
x!=null
之外,您还可以在哪里执行
(x=>x.HasValue)
,这与
Nullable
完全相同,并且更明显地表明您正在处理
Nullable
。有关详细信息,请参阅我链接到的页面。处理Nullable时,我个人的偏好是使用.HasValue和.Value属性。@PeterB绝对-我的偏好是使用解决方案which不依赖已经过滤掉空值的代码。可能是我需要重写问题。我不知道type()的
的这种行为,乍一看似乎很奇怪,但有时很有用。
IEnumerable<int> xs3 = xs.Where(x => x != null).Select(x => x.Value);