Linq 筛选Select中的空值

Linq 筛选Select中的空值,linq,Linq,我有一个类型为T的对象列表,我想把它转换成类型为K的对象 List<K> tranformedList = originalList.Select(x => transform(x)).ToList(); List-transformedlist=originalList.Select(x=>transform(x)).ToList(); 如果transform函数不能转换对象,它将返回null。如果我想过滤掉null元素,我可以调用 List<K> tranf

我有一个类型为T的对象列表,我想把它转换成类型为K的对象

List<K> tranformedList = originalList.Select(x => transform(x)).ToList();
List-transformedlist=originalList.Select(x=>transform(x)).ToList();
如果transform函数不能转换对象,它将返回null。如果我想过滤掉null元素,我可以调用

List<K> tranformedList = originalList.Select(x => transform(x))
                                     .Where(y => y != default(K))
                                     .ToList();
List-transformedlist=originalList.Select(x=>transform(x))
.其中(y=>y!=默认值(K))
.ToList();

或者,在LINQ中调用Select时,是否有其他方法过滤掉空元素

你就不能这样做吗:

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

您可以尝试使用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();
List-transformedlist=(从中的t开始)
(来自《原创作家》中的o)
选择变换(o))
其中t!=null
选择t.ToList();
我认为内森的作品也很好,但没有那么冗长,那怎么办

    List<K> tranformedList = originalList
                             .Select(x => transform(x))
                             .OfType<K>()
                             .ToList()
List-transformedlist=originalList
.选择(x=>transform(x))
第()类
托利斯先生()
同时负责取消绑定以消除空值(特别是当K是一个结构时)


David B我不相信你的代码
。其中(y=>y!=null)
在K是int时有效!如果K是一个int,那么就不可能编译该代码

使用Where而不是Select(Linq)

其中直接返回不带空值的列表

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

List-transformedlist=originalList.Select(x=>transform(x))
.Where(y=>!string.IsNullOrEmpty(y))
.ToList();

选择linq查询后,使用过滤空值!string.IsNullOrEmpty(“string”)string.IsNullOrWhiteSpace(“string”)在Where查询中。

刚刚对常规LINQ语句执行了此操作,如下所示:var transformedList=来自原始列表中的x,其中x!=空选择转换(x)(如果有帮助):将
Where
放在
select
之前,以便在转换之前进行过滤。由于
其中
链接在
Select
的结果上,前两条注释都忽略了这样一个事实,即如果x不可转换(而不是原始列表中的项),则转换操作可能会返回null,因此需要在转换之后而不是之前进行过滤。回答很好,我喜欢这个答案。作为一种更通用的方法,您是否可以执行
.OfType
,因为null永远不会是object类型,但任何其他对象都会是?或者这会导致装箱/拆箱(您提到的)计算成本高吗?
。选择(x=>transform(x))
可以是
。选择(transform)
。无需将其包装在相同的lambda中。与“.Select([…])的性能差异是什么?其中(y=>y!=null)”?我可以想象后者对一个集合迭代两次,那么“.Select([…]).OfType()做什么呢?您会接受IEnumerable的解决方案吗?IQueryable可能会稍微复杂一些,但您可能只需要IEnumerable支持。
Where()
将返回
IEnumerable
,这将是原始集合的某个子集
Select()
将返回
IEnumerable
,即根据旧对象集和提供的函数(接受类型为T的项)选择的一些新对象集。传递给
Select()
Func
的返回类型将决定返回的对象类型。此外,即使T==TResult,结果集也可能不是相同的项,甚至不是原始项的子集。因此,选择和何处实际上是不等价的,而何处不是一个好的选择。
List<K> tranformedList = originalList.Select(x => transform(x))
                                     .Where(y => !string.IsNullOrEmpty(y))
                                     .ToList();