Linq 筛选Select中的空值
我有一个类型为T的对象列表,我想把它转换成类型为K的对象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
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();