খালি IAsyncEnumerable তৈরি করুন


25

আমার একটি ইন্টারফেস রয়েছে যা এইভাবে লেখা হয়েছে:

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

এটি যদি একটি সরল আইনুনামেবল হয় return Enumerable.Empty<string>();তবে আমি করতাম তবে আমি কোনও পাইনি AsyncEnumerable.Empty<string>()

সমাধান নীচে উপস্থিত

আমি এটি খুঁজে পেয়েছি যা কাজ করে তবে বেশ অদ্ভুত:

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

কোন ধারণা?

উত্তর:


28

আপনি যদি 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
    }
}

আপনার তাত্ক্ষণিক জবাব এবং পরামর্শের জন্য ধন্যবাদ। আমি আশা করছিলাম যে কাঠামোর মধ্যে কিছু বিদ্যমান আছে।
কিউব 45

@ কিউব 45: আমি সাধারণত System.Linq.Async"কাঠামোর কার্যত অংশ" হিসাবে বিবেচনা করব । সেখানে খুব অল্প রয়েছে যে মাত্র netstandard2.1 যখন এটা আসে IAsyncEnumerable<T>
জন স্কিটি

@ কিউব 4545 আমি প্যাকেজটি ব্যবহার না করার বিষয়ে সতর্কতা অবলম্বন করব যখন আপনি আরও বেশি ব্যবহার শুরু করবেন তখন অ্যাসিঙ্ক প্রবাহের সাথে অনেকগুলি কোয়ার্ক রয়েছে যা আপনি যদি না জেনে থাকেন যে আপনি কী করছেন আমি সত্যই নাগেটে থাকব।
ফিলিপ কর্ডাস

আপনার উত্তরের জন্য ধন্যবাদ। আমি এর আগে IAsyncEnumerable কখনও ব্যবহার করি নি, এবং আমি কেবল "বাস্তবের জন্য" কিছু করছিলাম না, পরীক্ষা নিরীক্ষা করছিলাম। আপনি সম্ভবত সঠিক, প্যাকেজ দরকারী হতে পারে।
কিউব 45


11

যদি কোনও কারণে আপনি জনের উত্তরে উল্লিখিত প্যাকেজটি ইনস্টল করতে না চান তবে আপনি 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>()আপনার যে ক্ষেত্রে প্রয়োজন তা সংক্ষিপ্ত রূপায়ণ সরবরাহ করে এবং আপনি প্যাকেজটি ব্যবহার করতে / করতে পারবেন না। আপনি এখানে প্যাকেজে ব্যবহৃত বাস্তবায়ন পেতে পারেন ।


আপনার উত্তরের জন্য ধন্যবাদ. আসলে, এটিও একটি বিকল্প হবে। আমি মনে করি যে আমি অন্য প্যাকেজ ইনস্টল করার চেয়ে সেভাবেই পছন্দ করব। আমি এটিকে স্বীকৃত হিসাবে চিহ্নিত করব। নিতপিক: আপনি "এক্সটেনশন পদ্ধতি" বলছেন যখন এটি কোনও স্ট্যাটিক শ্রেণিতে কেবল একটি স্থির পদ্ধতি।
কিউব 45

1
@ কিউব 45: তাই কি আপনি জড়িত অ্যাসিনক্রোনাস সিকোয়েন্সগুলির সাথে কোনও লিনকিউ কার্যকারিতা ব্যবহার করার পরিকল্পনা করছেন না? কারণ আপনি সাধারণত সিঙ্ক্রোনাস লিনকুইয়ের সাথে কিছু করতে চাইলে আপনার সিস্টেম.লিংক.এন্সিঙ্ক দরকার।
জন স্কিটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.