Создать пустой IAsyncEnumerable - PullRequest
       63

Создать пустой IAsyncEnumerable

19 голосов
/ 22 декабря 2019

У меня есть интерфейс, который написан так:

public interface IItemRetriever
{
    public IAsyncEnumerable<string> GetItemsAsync();
}

Я хочу написать пустую реализацию, которая не возвращает элемент, например так:

public class EmptyItemRetriever : IItemRetriever
{
    public IAsyncEnumerable<string> GetItemsAsync()
    {
       // What do I put here if nothing is to be done?
    }
}

Если это былопросто IEnumerable, я бы return Enumerable.Empty<string>();, но я не нашел AsyncEnumerable.Empty<string>().

Обходные пути

Я нашел это, которое работает, но довольно странно:

public async IAsyncEnumerable<string> GetItemsAsync()
{
    await Task.CompletedTask;
    yield break;
}

Есть идеи?

1 Ответ

21 голосов
/ 22 декабря 2019

Если вы установите пакет System.Linq.Async, вы сможете использовать AsyncEnumable.Empty<string>(). Вот полный пример:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        IAsyncEnumerable<string> empty = AsyncEnumerable.Empty<string>();
        var count = await empty.CountAsync();
        Console.WriteLine(count); // Prints 0
    }
}
...