如何在 .NET 6/C# 10 中将 List<String?> 转换为 List<String>?
How do I convert List<String?> to List<String> in .NET 6 / C# 10?
使用 .NET 6 我有以下内容:
List<String> values = new List<String?> { null, "", "value" }
.Where(x => !String.IsNullOrEmpty(x))
.Select(y => y)
.ToList();
但我收到警告:
Nullability of reference types in value of type 'string?[]' doesn't match target type 'string[]'.
我认为使用
.Where(x => !String.IsNullOrEmpty(x))
会解决问题,但事实并非如此。如何解决这个问题?
这是您了解得更多的一种情况,可以通过 .Select(y => y!)
向编译器保证该值不是 null
List<string> values = new List<string?> { null, "", "value" }
.Where(x => !string.IsNullOrEmpty(x))
.Select(y => y!)
.ToList();
注意 : .Select(y => y.Value)
不会起作用,因为字符串是 引用类型 和 string?
表示 可为 null 的引用类型 ,而不是 可为 null 的值类型
正如 @Patrick Artner 在评论中提到的那样。您也可以使用 .Cast<string>()
来达到类似的效果,它本质上只是一个迭代器和通用方法中的常规转换,从而确保您获得所需的结果。
List<string> values = new List<string?> { null, "", "value" }
.Where(x => !string.IsNullOrEmpty(x))
.Cast<string>()
.ToList();
还有另一种方式(尽管推理起来有点困难)但可能更有效
List<string> values = new List<string?> { null, "", "value" }
.Where(x => !string.IsNullOrEmpty(x))!
.ToList<string>();
您可以在 ToList
之后使用 null-forgiving 运算符而无需额外的 Select
:
List<string> values = new List<string?> { null, "", "value" }
.Where(x => !string.IsNullOrEmpty(x))
.ToList()!;
使用 .NET 6 我有以下内容:
List<String> values = new List<String?> { null, "", "value" }
.Where(x => !String.IsNullOrEmpty(x))
.Select(y => y)
.ToList();
但我收到警告:
Nullability of reference types in value of type 'string?[]' doesn't match target type 'string[]'.
我认为使用
.Where(x => !String.IsNullOrEmpty(x))
会解决问题,但事实并非如此。如何解决这个问题?
这是您了解得更多的一种情况,可以通过 .Select(y => y!)
null
List<string> values = new List<string?> { null, "", "value" }
.Where(x => !string.IsNullOrEmpty(x))
.Select(y => y!)
.ToList();
注意 : .Select(y => y.Value)
不会起作用,因为字符串是 引用类型 和 string?
表示 可为 null 的引用类型 ,而不是 可为 null 的值类型
正如 @Patrick Artner 在评论中提到的那样。您也可以使用 .Cast<string>()
来达到类似的效果,它本质上只是一个迭代器和通用方法中的常规转换,从而确保您获得所需的结果。
List<string> values = new List<string?> { null, "", "value" }
.Where(x => !string.IsNullOrEmpty(x))
.Cast<string>()
.ToList();
还有另一种方式(尽管推理起来有点困难)但可能更有效
List<string> values = new List<string?> { null, "", "value" }
.Where(x => !string.IsNullOrEmpty(x))!
.ToList<string>();
您可以在 ToList
之后使用 null-forgiving 运算符而无需额外的 Select
:
List<string> values = new List<string?> { null, "", "value" }
.Where(x => !string.IsNullOrEmpty(x))
.ToList()!;