Search code examples
c#.net-6.0c#-10.0

How do I convert List<String?> to List<String> in .NET 6 / C# 10?


Using .NET 6 I have the following:

List<String> values = new List<String?> { null, "", "value" }
  .Where(x => !String.IsNullOrEmpty(x))
  .Select(y => y)
  .ToList();

But I am getting the warning:

Nullability of reference types in value of type 'string?[]' doesn't match target type 'string[]'.

I thought that using

.Where(x => !String.IsNullOrEmpty(x))

would solve the problem but it doesn't. How to fix this?


Solution

  • This is one case where you know better, and can assure the compiler the value is not null via .Select(y => y!)

    List<string> values = new List<string?> { null, "", "value" }
       .Where(x => !string.IsNullOrEmpty(x))
       .Select(y => y!)
       .ToList();
    

    Note : .Select(y => y.Value) is not going to work, as strings are reference types and string? represents a nullable reference type, not a nullable value type

    As mentioned in the comments by @Patrick Artner. You could also use .Cast<string>() to similar effect, which is essentially just an iterator and regular cast in a generic method, in turn assuring you have the desired result.

    List<string> values = new List<string?> { null, "", "value" }
       .Where(x => !string.IsNullOrEmpty(x))
       .Cast<string>()
       .ToList();
    

    And yet another way (albeit it a little harder to reason about) though likely more efficient

    List<string> values = new List<string?> { null, "", "value" }
       .Where(x => !string.IsNullOrEmpty(x))!
       .ToList<string>();