相关疑难解决方法(0)

是否有一种方便的方法来过滤C#8.0可空引用的序列,仅保留非空值?

我有这样的代码:

IEnumerable<string?> items = new [] { "test", null, "this" };
var nonNullItems = items.Where(item => item != null); //inferred as IEnumerable<string?>
var lengths = nonNullItems.Select(item => item.Length); //nullability warning here
Console.WriteLine(lengths.Max());
Run Code Online (Sandbox Code Playgroud)

我如何以一种方便的方式编写此代码,例如:

  • 没有空性警告,因为类型nonNullItems推断为IEnumerable<string>
  • 我不需要添加未经检查的非空性断言,例如item!(因为我想从编译器的健全性检查中受益,而不是依靠我成为无错误的编码器)
  • 我不添加运行时检查的不可为空的断言(因为这在代码大小和运行时都是无意义的开销,并且如果人为错误的发生晚于理想情况)。
  • 解决方案或编码模式可以更普遍地应用于可空引用类型的其他项序列。

我知道这种解决方案,它利用了C#8.0编译器中的流敏感型输入,但是它不是很漂亮,主要是因为它又长又嘈杂:

var notNullItems = items.SelectMany(item => 
    item != null ? new[] { item } : Array.Empty<string>())
);
Run Code Online (Sandbox Code Playgroud)

有更好的选择吗?

c# nullable nullable-reference-types

6
推荐指数
3
解决办法
87
查看次数

标签 统计

c# ×1

nullable ×1

nullable-reference-types ×1