WhereNotNull
I’m a big fan of the Nullable Reference Types feature added in C# 8.0. It lets the compiler catch a bunch of potential runtime errors, and I guarantee if you turn it on you’ll get a bunch of warnings. As of .NET 5.0, the entire BCL is now covered with nullable annotations, and a lot of the extended ecosystem supports them too. But there are situations where the compiler is unable to work out that you’ve done a null check, meaning you either have to use the “null-forgiving operator” (where you append a bang to the identifier, like item!.Name), disable the null checking, or just ignore the warning. The WhereNotNull extension method filters out nulls and changes the expression type accordingly. source: https://rendle.dev/posts/where-not-null/
Source
public static IEnumerable<T> WhereNotNull<T>(this IEnumerable<T?> source) where T : class
{
foreach (var item in source)
{
if (item is not null) yield return item;
}
}
Example
IEnumerable<string?> files = project.MetadataReferences
.OfType<PortableExecutableReference>
.Select(p => p.FilePath)
.Where(f => f is not null);
// Versus
IEnumerable<string> files = project.MetadataReferences
.OfType<PortableExecutableReference>
.Select(p => p.FilePath)
.WhereNotNull();