다음과 같이 작성된 인터페이스가 있습니다.
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>()
필요하고 패키지를 사용할 수 없거나 원하지 않는 경우 에 대한 간단한 구현을 제공 합니다. 패키지 에서 사용 된 구현은 여기 에서 찾을 수 있습니다 .