IEnumerable.FirstOrDefaultAsync (предикат) ?. ContinueWith () возвращает, если результат нулевой? - PullRequest
1 голос
/ 05 июля 2019

Я пишу фрагмент кода, который использует метод .FirstOrDefaultAsync() LINQ. Я знаю, что обычно, если вы используете его в выражении с асинхронным методом none, который с помощью ? впоследствии возвращает без оценки остальных вызовов метода.

Ex. Код Suedo

class Item = {
  string Name
  string Value
}

items = Item[]

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

Если list не содержит item с именем «Item One», то результатом будет null и exception не будет выброшено, потому что null не имеет свойства Value.

Я хочу выполнить ту же операцию асинхронно, будет ли эта работа:

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

Будет ли это просто возвращаться без оценки ContinueWith(), если такой предмет не найден? Или ? не работает таким образом асинхронно?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Код, который вы показали, не будет работать, так как он проверяет, является ли 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;
1 голос
/ 05 июля 2019

Вы должны использовать круглые скобки () для асинхронных методов

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

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...