[c#] 빈 IAsyncEnumerable 생성

다음과 같이 작성된 인터페이스가 있습니다.

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;
}

어떤 생각?



답변

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
    }
}


답변

어떤 이유로 든 Jon의 답변에 언급 된 패키지를 설치하지 않으려는 경우 다음 AsyncEnumerable.Empty<T>()과 같은 방법을 만들 수 있습니다 .

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
public static class AsyncEnumerable
{
    public static IAsyncEnumerator<T> Empty<T>() => EmptyAsyncEnumerator<T>.Instance;

    class EmptyAsyncEnumerator<T> : IAsyncEnumerator<T>
    {
        public static readonly EmptyAsyncEnumerator<T> Instance =
            new EmptyAsyncEnumerator<T>();
        public T Current => default!;
        public ValueTask DisposeAsync() => default;
        public ValueTask<bool> MoveNextAsync() => new ValueTask<bool>(false);
    }
}

참고 : 대답은 System.Linq.Async패키지 사용을 권장하지 않습니다 . 이 답변은 AsyncEnumerable.Empty<T>()필요하고 패키지를 사용할 수 없거나 원하지 않는 경우 에 대한 간단한 구현을 제공 합니다. 패키지 에서 사용 된 구현은 여기 에서 찾을 수 있습니다 .


답변