我正在做一件非常简单和直截了当的事情,我不禁怀疑/希望它能变得更短.
出于示例的目的,让我们假设我有一个IEnumerable<int?>
,而我想要的只是一个只产生非空值的IEnumerable<int>
.以下是一些可以工作的代码,但可以让它更简洁吗?
public static void Main( string[] args )
{
int?[] a = { null, 42, null, 5 };
IEnumerable<int> ints = a //
.Where( i => i.HasValue ) //
.Select( i => i!.Value );
foreach( var i in ints )
Console.WriteLine( i );
Console.ReadLine();
}
请注意,如果它能变得更简洁,那么它也会变得更整洁,因为丑陋的i!
可以避免.
但也请注意,这只是一个示例,所以请不要关注这些是可以为空的整数这一事实.它们可以很容易地是一些可能被派生的复杂对象,我们正试图获得仅那些派生更多的对象的枚举,这些对象转换为更派生的类型.
那么,这个问题就是如何在一条语句中做一个Where()
和Select()
,从而一步实现转换和过滤,从而利用过滤过程中所做的工作,减少转换过程中所需的工作量.