在Select中过滤Null值

时间:2008-12-31 00:30:37

标签: linq

我有类型为T的对象的IQueryable列表,我想将其转换为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元素的方法?

5 个答案:

答案 0 :(得分:65)

你不能只做这样的事情:

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

答案 1 :(得分:44)

怎么样?
    List<K> tranformedList = originalList
                             .Select(x => transform(x))
                             .OfType<K>()
                             .ToList()

注意取消装箱同时摆脱空值(特别是当K是结构时)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您可以尝试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();

我认为内森的作品也不那么冗长

答案 4 :(得分:0)

使用“位置而不是选择(Linq)”。

直接返回没有空值的列表

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