Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建空的IAsyncEnumerable_C#_C# 8.0_Iasyncenumerable - Fatal编程技术网

C# 创建空的IAsyncEnumerable

C# 创建空的IAsyncEnumerable,c#,c#-8.0,iasyncenumerable,C#,C# 8.0,Iasyncenumerable,我有一个这样写的界面: using System; using System.Collections.Generic; using System.Threading.Tasks; public static class AsyncEnumerable { public static IAsyncEnumerator<T> Empty<T>() => EmptyAsyncEnumerator<T>.Instance; class Empt

我有一个这样写的界面:

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);
    }
}
公共接口IItemRetriever
{
public IAsyncEnumerable GetItemsAsync();
}
我想编写一个不返回任何项的空实现,如下所示:

公共类EmptyItemRetriever:IItemRetriever
{
公共IAsyncEnumerable GetItemsAsync()
{
//如果什么都不做,我在这里放什么?
}
}
如果它是一个普通的IEnumerable,我将
返回Enumerable.Empty()
,但我没有找到任何
AsyncEnumerable.Empty()

权变措施 我发现这个很有效,但很奇怪:

public异步IAsyncEnumerable GetItemsAsync()
{
等待任务。完成任务;
屈服断裂;
}
有什么想法吗?

如果您安装了该软件包,您应该能够使用
AsyncEnumable.Empty()
。下面是一个完整的示例:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
班级计划
{
静态异步任务Main()
{
IAsyncEnumerable empty=AsyncEnumerable.empty();
var count=wait empty.CountAsync();
Console.WriteLine(计数);//打印0
}
}

如果出于任何原因,您不想安装Jon回答中提到的软件包,您可以创建方法
AsyncEnumerable.Empty()
,如下所示:

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.Collections.Generic;
使用System.Threading.Tasks;
可异步枚举的公共静态类
{
公共静态IAsyncEnumerator Empty()=>EmptyAsyncEnumerator.Instance;
类EmptyAsyncEnumerator:IAsyncEnumerator
{
公共静态只读EmptyAsyncEnumerator实例=
新的EmptyAsyncEnumerator();
公共T电流=>默认值!;
public ValueTask DisposeAsync()=>默认值;
public ValueTask MoveNextAsync()=>new ValueTask(false);
}
}

注意:答案并不妨碍使用
System.Linq.Async
包。这个答案提供了
AsyncEnumerable.Empty()
的一个简短实现,用于您需要它,但无法/不想使用该包的情况。您可以在包中找到所使用的实现。

我想避免安装新包,但实际上没有按照原始问题中的要求实现
IAsyncEnumerable
。下面是一个完整的解决方案,它实现了该接口,可以轻松地调用
AsyncEnumerable.Empty
,就像
Enumerable.Empty
现在的工作方式一样

可异步枚举的公共静态类
{
/// 
///创建不产生任何结果的,类似于。
/// 
公共静态IAsyncEnumerable Empty()=>EmptyAsyncEnumerator.Instance;
私有类EmptyAsyncEnumerator:IAsyncEnumerator,IAsyncEnumerable
{
公共静态只读EmptyAsyncEnumerator实例=新EmptyAsyncEnumerator();
公共T电流=>默认值;
public ValueTask DisposeAsync()=>默认值;
公共IAsyncEnumerator GetAsyncEnumerator(CancellationToken CancellationToken=默认值)
{
cancellationToken.ThrowIfCancellationRequested();
归还这个;
}
public ValueTask MoveNextAsync()=>new ValueTask(false);
}
}

感谢您的及时回复和建议。我希望框架中存在一些东西。@cube45:我通常认为
System.Linq.Async
是“框架的一部分”。netstandard2.1中很少有这样的东西,当谈到
IAsyncEnumerable
@cube45时,我会小心不要使用这个包。当你开始更多地使用它时,你会发现有许多具有异步流的夸克,除非你真的知道你在做什么,否则我真的会很高兴。谢谢你的回答。我以前从未使用过IAsyncEnumerable,我只是在做实验,而不是做“真正的”事情。你可能是对的,这个软件包可能很有用。还有别的方法吗?当我安装了Linq.Async nuget之后,对“Where”的所有调用都开始是来自AsyncEnumerable和IQueryable(来自实体框架核心)的不明确调用。谢谢您的回答。事实上,这也是一种选择。我想我更喜欢这种方式,而不是安装另一个软件包。我会把这个标为接受。吹毛求疵:你说的是“扩展方法”,而它只是静态类中的一个静态方法。@cube45:那么,你不打算在涉及异步序列的情况下使用任何LINQ功能吗?因为只要您想要执行通常使用同步LINQ执行的任何操作,就需要System.LINQ.Async。此代码用于返回
IAsyncEnumerator
,而不是OP要求的
IAsyncEnumerable
。为了实现这一点,需要将
IAsyncEnumerable
添加到
EmptyAsyncEnumerator
类中,然后从链接的代码中包含
GetAsyncEnumerator
方法。