我有类型为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元素的方法?
答案 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();