如果结果为null,IEnumerable.FirstOrDefaultAsync(predicate)?. ContinueWith()是否返回?

时间:2019-07-05 10:37:45

标签: c# linq asynchronous

我正在编写一段使用.FirstOrDefaultAsync() LINQ方法的代码。我知道,通常如果您在具有none异步方法的表达式中使用它,则之后使用?会返回而不评估其余方法调用。

例如 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,因为{ {1}}没有属性null

我想异步执行相同的操作,这项工作会完成吗:

Value

如果找不到这样的项目,是否会返回而不评估list.FirstOrDefaultAsync(item => item.Name == "Item One")? .ContinueWith(result => result.Result.Value); ?还是ContinueWith()不能以这种方式异步工作?

2 个答案:

答案 0 :(得分:1)

对于异步方法,您必须使用括号()

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

:)

答案 1 :(得分:1)

您显示的代码无效,因为它正在检查Task返回的FirstOrDefaultAsync是否为空-永远不会为空。另外,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;