在Select中过滤Null值

fat*_*dha 56 linq

我有类型为T的对象的IQueryable列表,我想将其转换为K类型的对象

List<K> tranformedList = originalList.Select(x => transform(x)).ToList();
Run Code Online (Sandbox Code Playgroud)

如果转换函数不能转换对象,则返回null.如果我想过滤掉null元素,我可以调用它

List<K> tranformedList = originalList.Select(x => transform(x))
                                     .Where(y => y != default(K))
                                     .ToList();
Run Code Online (Sandbox Code Playgroud)

或者在LINQ中调用Select时是否还有其他过滤掉null元素的方法?

Nat*_*n W 73

你不能只做这样的事情:

List<K> tranformedList = originalList.Select(x => tranform(x))
                                 .Where(y => y != null) //Check for nulls
                                 .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 如果有帮助:将“Where”放在“Select”之前,以便在转换之前进行过滤。由于 `Where` 链接在 `Select` 的结果上 (2认同)
  • 前面两条注释都忽略了这样一个事实:如果 x 不可变换(而不是原始列表中的项目),则变换是可以返回 null 的操作,因此过滤需要在变换之后完成,而不是之前完成。 (2认同)

sti*_*tty 48

关于什么

    List<K> tranformedList = originalList
                             .Select(x => transform(x))
                             .OfType<K>()
                             .ToList()
Run Code Online (Sandbox Code Playgroud)

注意拆箱同时摆脱空值(特别是当K是一个结构时)

当BI .Where(y => y != null)是int时,David BI不相信你的代码有效!如果K是int,你将无法获得编译代码!

  • `.Select(x => transform(x))`可以是`.Select(transform)`.无需将其包装在相同的lambda中. (11认同)
  • 我喜欢这个答案.你能做`.OfType <object>`作为一种更通用的方法,因为null永远不会是类型对象,但任何其他对象都会?或者这会导致拳击/拆箱(你提到)哪个是计算上昂贵的? (3认同)