c# - 如果结果为空,IEnumerable.FirstOrDefaultAsync( predicate )?.ContinueWith() 是否返回?

标签 c# linq asynchronous

我正在编写一段使用 .FirstOrDefaultAsync() LINQ 方法的代码。我知道通常如果你在一个表达式中使用它,使用 none async 方法,然后使用 ? 返回而不评估其余的方法调用。

例。 Suedo 代码

class Item = {
  string Name
  string Value
}

items = Item[]

var result = items.FirstOrDefault(item => item.Name == "Item One")?.Value;

如果 list 不包含名为“Item One”的 item,则结果将为 null 和一个 exception 不会被抛出,因为 null 没有属性 Value

我想异步执行相同的操作,这行得通吗:

list.FirstOrDefaultAsync(item => item.Name == "Item One")?
  .ContinueWith(result => result.Result.Value);

如果没有找到这样的项目,这是否会在不评估 ContinueWith() 的情况下直接返回?还是 ? 不能以这种方式异步工作?

最佳答案

您显示的代码将不起作用,因为它正在检查 FirstOrDefaultAsync 返回的 Task 是否为 null - 它永远不会。此外,ContinueWith 过度扩展,因为它的主要用途是链接异步操作。提取值不是异步的,所以为什么不呢

var item = await list.FirstOrDefaultAsync(item => item.Name == "Item One");
var result = item?.Value;

如果你愿意,你可以单行

var result = (await list.FirstOrDefaultAsync(item => item.Name == "Item One"))?.Value;

关于c# - 如果结果为空,IEnumerable.FirstOrDefaultAsync( predicate )?.ContinueWith() 是否返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56901455/

相关文章:

c# - 如何使用过滤器从 C# 中的 DataTable 中删除行?

c# - 任务不包含在一行代码中完成的定义

C++:如何异步调用同步库调用?

c# - 为什么分配的内存比预期的多?

C# Entity Framework Core - LINQ 检查一个数组在另一个数组中是否存在

javascript - RxJS +(异步/等待)用于(多事件)用例

android - 为 Actionbar SearchView 创建异步 ContentProvider

c# - 当我们使用 JSON.Net 序列化可序列化对象时,JSON 字符串与 DatacontractJSON 序列化器不同

c# - 如何在 C# 中正确检查 HttpResponseMessage 的 http 状态代码?

c# - 哪一个在构建构建器时更有效?