过滤 Select 中的 Null 值

问题描述 投票:0回答:5

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

List<K> tranformedList = originalList.Select(x => transform(x)).ToList();

如果变换函数无法变换对象,则返回 null。如果我想过滤掉 null 元素,我可以调用

List<K> tranformedList = originalList.Select(x => transform(x))
                                     .Where(y => y != default(K))
                                     .ToList();

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

linq
5个回答
102
投票

你不能做这样的事情吗:

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

84
投票

那又如何

List<K> tranformedList = originalList
                         .Select(transform)
                         .OfType<K>()
                         .ToList()

同时负责拆箱并消除空值(特别是当

K
struct
时)

David B 我不相信你的代码

.Where(y => y != null)
K
int
时才有效!如果
K
int

,那么你将无法编译该代码

1
投票
List<K> tranformedList = originalList.Select(x => transform(x))
                                     .Where(y => !string.IsNullOrEmpty(y))
                                     .ToList();

在 Select linq 查询之后,在Where 查询中使用 !string.IsNullOrEmpty("string")string.IsNullOrWhiteSpace("string") 过滤空值。


0
投票

使用Where而不是Select (Linq)。

Where 直接返回不带空值的列表

List tranformedList = originalList.Where(x => x != null).ToList();


-1
投票

您可以尝试 for 循环并将非空值添加到新的转换列表中。

foreach (var original in originalList)
{
    K transformed = tranform(orignal);
    if (transformed != null)
    {
        tranformedList.Add(transformed);
    }
}

或者你可以尝试

        List<K> tranformedList = (from t in
                                      (from o in originalList
                                       select tranform(o))
                                  where t != null
                                  select t).ToList();

我认为 Nathan 的效果也很好,但没那么冗长

© www.soinside.com 2019 - 2024. All rights reserved.