'ফলন ফেরত' এর সঠিক ব্যবহার


903

ফলন শব্দ সেগুলির একটি কীওয়ার্ড আমার নিগূঢ় করা চলতে C #, এবং আমি নিশ্চিত যে আমি এটি সঠিকভাবে ব্যবহার করছি না চলেছি।

নিম্নলিখিত দুটি টুকরো কোডের মধ্যে কোনটি পছন্দনীয় এবং কেন?

সংস্করণ 1: ফলন রিটার্ন ব্যবহার করে

public static IEnumerable<Product> GetAllProducts()
{
    using (AdventureWorksEntities db = new AdventureWorksEntities())
    {
        var products = from product in db.Product
                       select product;

        foreach (Product product in products)
        {
            yield return product;
        }
    }
}

সংস্করণ 2: তালিকাটি ফিরিয়ে দিন

public static IEnumerable<Product> GetAllProducts()
{
    using (AdventureWorksEntities db = new AdventureWorksEntities())
    {
        var products = from product in db.Product
                       select product;

        return products.ToList<Product>();
    }
}

38
yieldবাঁধা IEnumerable<T>এবং তার ধরণের। এটি কোনওভাবেই অলস মূল্যায়নে রয়েছে
জয়দার

অনুরূপ প্রশ্নের গ্রেট উত্তর এখানে। stackoverflow.com/questions/15381708/…
সঞ্জীব রায়

1
এখানে একটি ভাল ব্যবহার উদাহরণ stackoverflow.com/questions/3392612/...
ValGe

6
আমি ব্যবহারের জন্য একটি ভাল কেস দেখতে পাচ্ছি yield returnযদি ফলাফলগুলির ফলাফলগুলির মাধ্যমে পুনরাবৃত্তি করা কোডটি GetAllProducts()ব্যবহারকারীকে অকাল প্রক্রিয়াকরণ বাতিল করার সুযোগ দেয়।
জেএমডি

2
আমি এই থ্রেডটি সত্যই সহায়ক বলে খুঁজে পেয়েছি: প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জারএইচএ
a

উত্তর:


806

আমি তালিকার পরবর্তী আইটেমগুলি (বা এমনকি আইটেমের পরবর্তী গ্রুপ) গণনা করি তখন আমি ফলন-রিটার্ন ব্যবহার করি।

আপনার সংস্করণ 2 ব্যবহার করে, ফিরে আসার আগে আপনার অবশ্যই সম্পূর্ণ তালিকা থাকতে হবে। ফলন-রিটার্ন ব্যবহার করে, আপনার ফিরে আসার আগে কেবল পরবর্তী আইটেমটি থাকা দরকার।

অন্যান্য জিনিসের মধ্যে এটি জটিল গণনার গণনা ব্যয়কে বৃহত্তর সময়-ফ্রেমে ছড়িয়ে দিতে সহায়তা করে। উদাহরণস্বরূপ, যদি তালিকাটি কোনও জিইউআইতে আবদ্ধ থাকে এবং ব্যবহারকারী কখনও শেষ পৃষ্ঠায় না যায়, আপনি কখনই তালিকার চূড়ান্ত আইটেমগুলি গণনা করবেন না।

অন্য একটি ক্ষেত্রে যেখানে ফলন-প্রত্যাশা অগ্রাধিকারযোগ্য, যদি আইইনামারবেবল একটি অসীম সেট উপস্থাপন করে। প্রাইম নাম্বারগুলির তালিকা বা এলোমেলো সংখ্যার একটি অসীম তালিকা বিবেচনা করুন। আপনি একবারে সম্পূর্ণ আইএনওনামেবল ফিরিয়ে দিতে পারবেন না, তাই আপনি তালিকাটি ক্রমবর্ধমানভাবে ফিরতে ফলন-ফেরত ব্যবহার করুন।

আপনার বিশেষ উদাহরণে, আপনার পণ্যগুলির সম্পূর্ণ তালিকা রয়েছে, সুতরাং আমি সংস্করণ 2 ব্যবহার করব।


31
আমি নীটপিক করব যে আপনার উদাহরণ 3 প্রশ্নে দুটি সুবিধার সাথে মিলিত। 1) এটি গণনা ব্যয় ছড়িয়ে দেয় (কখনও কখনও কোনও সুবিধা, কখনও কখনও না) 2) এটি ব্যবহারের ক্ষেত্রে বেশিরভাগ ক্ষেত্রে অনির্দিষ্টকালের জন্য গণনা এড়াতে পারে। এটি মধ্যবর্তী অবস্থার চারপাশে রাখে এমন সম্ভাব্য অপূর্ণতা উল্লেখ করতে আপনি ব্যর্থ হন। যদি আপনার মধ্যে মধ্যবর্তী রাষ্ট্রের উল্লেখযোগ্য পরিমাণ থাকে (সদৃশ নির্মূলের জন্য একটি হ্যাশসেট বলুন) তবে ফলনের ব্যবহার আপনার স্মৃতিচারণের ছাপ বাড়িয়ে তুলতে পারে।
কেনেট বেলেনকি

8
এছাড়াও, যদি প্রতিটি পৃথক উপাদান খুব বড় হয় তবে তাদের কেবল অনুক্রমিকভাবে অ্যাক্সেস করা দরকার, ফলন আরও ভাল।
কেনেট বেলেনকি

2
এবং অবশেষে ... খুব সিরিয়ালাইজড ফর্মে অ্যাসিক্রোনাস কোড লেখার জন্য ফলনটি ব্যবহারের জন্য কিছুটা দুর্বল কিন্তু মাঝে মাঝে কার্যকর কৌশল রয়েছে।
কেনেট বেলেনকি

12
আর একটি উদাহরণ যা আকর্ষণীয় হতে পারে তা হ'ল বড় সিএসভি ফাইলগুলি পড়ার সময়। আপনি প্রতিটি উপাদান পড়তে চান তবে আপনি আপনার নির্ভরতা দূরেও বের করতে চান। একটি অনুমানযোগ্য <> ফিরিয়ে দেওয়া ফলন আপনাকে প্রতিটি সারি ফেরত দিতে এবং প্রতিটি সারি পৃথকভাবে প্রক্রিয়া করার অনুমতি দেয়। মেমরিতে 10 এমবি ফাইল পড়ার দরকার নেই। একবারে মাত্র একটি লাইন।
ম্যাক্সিমাম রৌইলার

1
Yield returnআপনার নিজস্ব কাস্টম পুনরাবৃত্ত শ্রেণীর লেখার জন্য শর্টহ্যান্ড বলে মনে হচ্ছে (আইইনুমরেটর প্রয়োগ করুন)। সুতরাং, উল্লিখিত সুবিধাগুলি কাস্টম পুনরাবৃত্তকারী ক্লাসেও প্রযোজ্য। যাইহোক, উভয় কনস্ট্রাক্টই মধ্যবর্তী অবস্থা রাখে। এটি সবচেয়ে সাধারণ আকারে এটি বর্তমান অবজেক্টের একটি রেফারেন্স ধরে রাখার বিষয়ে।
জে ওউওহ্যান্ড

641

একটি অস্থায়ী তালিকা তৈরি করা পুরো ভিডিওটি ডাউনলোড করার মতো, যেখানে ব্যবহার yieldকরা সেই ভিডিওটি স্ট্রিম করার মতো।


180
আমি পুরোপুরি সচেতন যে এই উত্তরটি কোনও প্রযুক্তিগত উত্তর নয় তবে আমি বিশ্বাস করি যে ফলনের কীওয়ার্ড বোঝার সময় ফলন এবং ভিডিও স্ট্রিমিংয়ের মধ্যে সাদৃশ্য একটি ভাল উদাহরণ হিসাবে কাজ করে। প্রযুক্তিগত সবকিছুই ইতিমধ্যে এই বিষয় সম্পর্কে বলা হয়েছে, তাই আমি "অন্য কথায়" ব্যাখ্যা করার চেষ্টা করেছি। এমন কোনও সম্প্রদায়ের নিয়ম রয়েছে যা বলে যে আপনি আপনার ধারণাগুলি অ প্রযুক্তিগত দিক দিয়ে ব্যাখ্যা করতে পারবেন না?
আনার খলিলভ

13
আমি নিশ্চিত না যে আপনাকে কারা ভোট দিয়েছে এবং কেন (আমি আশা করি তারা মন্তব্য করত) তবে আমি মনে করি এটি প্রযুক্তিগত সম্ভাবনা থেকে কিছুটা বর্ণনা করে।
সেনফো

22
এখনও ধারণাটি উপলব্ধি করা হয়েছে এবং এটি এটিকে আরও ফোকাসের মধ্যে আনতে সহায়তা করেছে, দুর্দান্ত উপমা।
টনি

11
আমি এই উত্তরটি পছন্দ করি তবে এটি প্রশ্নের উত্তর দেয় না।
এভিনিস

73

আপনার যখন ব্যবহার করা উচিত তখন বোঝার জন্য একটি ধারণাগত উদাহরণ হিসাবে yield, আসুন যাক পদ্ধতিটি ConsumeLoop()আইটেমগুলি দ্বারা ফেরত / উপার্জনের প্রক্রিয়াটি প্রক্রিয়া করে ProduceList():

void ConsumeLoop() {
    foreach (Consumable item in ProduceList())        // might have to wait here
        item.Consume();
}

IEnumerable<Consumable> ProduceList() {
    while (KeepProducing())
        yield return ProduceExpensiveConsumable();    // expensive
}

ছাড়া yield, কলটিতে ProduceList()দীর্ঘ সময় লাগতে পারে কারণ আপনাকে ফেরার আগে তালিকাটি শেষ করতে হবে:

//pseudo-assembly
Produce consumable[0]                   // expensive operation, e.g. disk I/O
Produce consumable[1]                   // waiting...
Produce consumable[2]                   // waiting...
Produce consumable[3]                   // completed the consumable list
Consume consumable[0]                   // start consuming
Consume consumable[1]
Consume consumable[2]
Consume consumable[3]

ব্যবহার করে yieldএটি পুনরায় সাজানো হয়, "সমান্তরালভাবে" কাজ করার ধরণ:

//pseudo-assembly
Produce consumable[0]
Consume consumable[0]                   // immediately Consume
Produce consumable[1]
Consume consumable[1]                   // consume next
Produce consumable[2]
Consume consumable[2]                   // consume next
Produce consumable[3]
Consume consumable[3]                   // consume next

এবং শেষ অবধি, ইতিমধ্যে যতগুলি ইতিমধ্যে পরামর্শ দিয়েছে, আপনার সংস্করণ 2 ব্যবহার করা উচিত কারণ আপনার ইতিমধ্যে যাইহোক সম্পূর্ণ তালিকা রয়েছে।


30

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি কীভাবে ফলন কীওয়ার্ডটি সৃজনশীলভাবে ব্যবহার করতে পারি তার একটি উদাহরণ দিতে চাই। আমি এই কৌশলটি থেকে সত্যিই উপকৃত হয়েছি । আশা করি এই প্রশ্নে হোঁচট খায় যে কারও পক্ষে এটি সহায়তা করবে।

দ্রষ্টব্য: ফলন কীওয়ার্ডটি কেবল সংগ্রহ তৈরির অন্য উপায় হিসাবে ভাবেন না। উত্পাদনের শক্তির একটি বড় অংশ আসে যে কলিং কোডটি পরবর্তী মানটির সাথে পুনরুক্ত না হওয়া অবধি কার্যকর পদ্ধতিটি আপনার পদ্ধতি বা সম্পত্তিতে বিরতি দেওয়া হয়েছিল। এখানে আমার উদাহরণ:

ফলন কীওয়ার্ডটি ব্যবহার করে (রব আইজেনবার্গের ক্যালিবার্ন। মাইক্রো কর্টিনেস প্রয়োগের সাথে) আমাকে একটি ওয়েব পরিষেবায় একটি অ্যাসিনক্রোনাস কলটি প্রকাশ করতে দেয়:

public IEnumerable<IResult> HandleButtonClick() {
    yield return Show.Busy();

    var loginCall = new LoginResult(wsClient, Username, Password);
    yield return loginCall;
    this.IsLoggedIn = loginCall.Success;

    yield return Show.NotBusy();
}

এটি যা করবে তা হ'ল আমার ব্যস্টি ইন্ডিকেটরটি চালু করা, আমার ওয়েব পরিষেবায় লগইন পদ্ধতিটি কল করা, আমার ইসলগডইন পতাকাটি রিটার্ন মানটিতে সেট করা এবং তারপরে ব্যাসিআইন্ডিকেটরটি বন্ধ করে দেওয়া।

এটি কীভাবে কাজ করে তা এখানে: আইআরসাল্টের একটি এক্সিকিউট পদ্ধতি এবং একটি সম্পূর্ণ ইভেন্ট রয়েছে। ক্যালিবার্ন.মাইক্রো হ্যান্ডলবটনক্লিক () থেকে কলটি থেকে আইনিউমরেটরটিকে ধরে এবং এটি কর্টিন.বেগিনএক্সেকিউট পদ্ধতিতে পাস করে। বিগনিএক্সেক্ট পদ্ধতিটি আইআরএসল্টগুলির মাধ্যমে পুনরাবৃত্তি শুরু করে। যখন প্রথম আইআরসাল্ট ফিরে আসে, হ্যান্ডেল বাটনক্লিক () এর ভিতরে মৃত্যুদন্ড থামিয়ে দেওয়া হয়, এবং বিগনিএক্সেকিউট () একটি ইভেন্ট হ্যান্ডলার সংযুক্ত ইভেন্টের সাথে সংযুক্ত করে এবং এক্সিকিউট () কল করে। IResult.Execute () হয় একটি সিঙ্ক্রোনাস বা একটি অ্যাসিঙ্ক্রোনাস টাস্ক সম্পাদন করতে পারে এবং এটি সম্পন্ন হওয়ার পরে সম্পূর্ণ ইভেন্টটি ছড়িয়ে দেয়।

লগইনআরসাল্টকে এরকম কিছু দেখাচ্ছে:

public LoginResult : IResult {
    // Constructor to set private members...

    public void Execute(ActionExecutionContext context) {
        wsClient.LoginCompleted += (sender, e) => {
            this.Success = e.Result;
            Completed(this, new ResultCompletionEventArgs());
        };
        wsClient.Login(username, password);
    }

    public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
    public bool Success { get; private set; }
}

এটি এরকম কিছু সেট আপ করতে এবং যা চলছে তা দেখার জন্য নির্বাহের মধ্য দিয়ে পদক্ষেপ নিতে সহায়তা করতে পারে।

এই কেউ সাহায্য করে আউট আশা করি! ফলনটি বিভিন্নভাবে ব্যবহার করা যেতে পারে সেগুলি অন্বেষণ করতে আমি সত্যিই উপভোগ করেছি।


1
আপনার কোড নমুনা কীভাবে ফোরচ ব্লকের ফলন ছাড়িয়ে ব্যবহার করতে হয় তার একটি দুর্দান্ত উদাহরণ। বেশিরভাগ উদাহরণ একটি পুনরাবৃত্তকারী মধ্যে ফলন ফেরত দেখায়। খুব সহায়ক যেমন আমি এসও-তে প্রশ্ন জিজ্ঞাসা করতে চলেছিলাম তখন একজন পুনরুক্তির বাইরে ফলন কীভাবে ব্যবহার করা যায়!
শেলবিপিরের

yieldএইভাবে ব্যবহার করা আমার কাছে কখনও ঘটেনি । এটি async / প্রতীক্ষিত প্যাটার্ন অনুকরণ করার মত মার্জিত উপায়ের মতো বলে মনে হচ্ছে (যা আমি মনে করি এটি yieldযদি আজ আবার লিখিত হয় তবে তার পরিবর্তে ব্যবহৃত হত)। আপনি কি দেখেছেন যে এই সৃজনশীল ব্যবহারগুলি yieldএই প্রশ্নের উত্তর দেওয়ার পর থেকেই সি # বিবর্তিত হওয়ার সাথে সাথে বছরগুলিতে হ্রাসকারী রিটার্নগুলি (কোনও শঙ্কিত উদ্দেশ্য নয়) কমছে? বা আপনি এখনও আধুনিক চতুর ব্যবহারের ক্ষেত্রে যেমন আসছেন? এবং যদি তা হয় তবে আপনি কি আমাদের জন্য আরও একটি আকর্ষণীয় দৃশ্যের ভাগীদার করতে আপত্তি করবেন?
Lopsided

27

এই উদ্ভট পরামর্শ ভালো বলে মনে হচ্ছে যাচ্ছে, কিন্তু আমি কিভাবে ব্যবহার করতে শিখেছি yieldপাইথন মধ্যে জেনারেটর একটি উপস্থাপনা পড়ে C # মূল শব্দ: ডেভিড এম Beazley এর http://www.dabeaz.com/generators/Generators.pdf । উপস্থাপনাটি বুঝতে আপনাকে বেশি পাইথন জানতে হবে না - আমি তা করি নি। আমি কীভাবে জেনারেটর কাজ করে তা নয় তবে কেন আপনার যত্ন নেওয়া উচিত তা ব্যাখ্যা করতে আমি এটি খুব সহায়ক বলে মনে করেছি।


1
উপস্থাপনাটি একটি সাধারণ ওভারভিউ সরবরাহ করে। এটি সি # তে কীভাবে কাজ করে তার বিশদ বিবরণ রে চেন দ্বারা স্ট্যাকওভারফ্লো . com/ a/ 39507/939250 লিঙ্কে আলোচনা করেছেন প্রথম লিঙ্কটি বিশদে বিশদভাবে ব্যাখ্যা করেছে যে ফলন ফেরতের পদ্ধতির শেষে দ্বিতীয়, অন্তর্ভুক্ত রিটার্ন রয়েছে।
ডোনাল লাফার্টি

18

ফলন ফেরত আলগোরিদিমগুলির জন্য খুব শক্তিশালী হতে পারে যেখানে আপনাকে লক্ষ লক্ষ বস্তুর মাধ্যমে পুনরাবৃত্তি করতে হবে। নীচের উদাহরণটি বিবেচনা করুন যেখানে আপনাকে রাইড ভাগ করে নেওয়ার জন্য সম্ভাব্য ভ্রমণের গণনা করতে হবে। প্রথমে আমরা সম্ভাব্য ট্রিপগুলি উত্পাদন করি:

    static IEnumerable<Trip> CreatePossibleTrips()
    {
        for (int i = 0; i < 1000000; i++)
        {
            yield return new Trip
            {
                Id = i.ToString(),
                Driver = new Driver { Id = i.ToString() }
            };
        }
    }

তারপরে প্রতিটি ভ্রমণে পুনরাবৃত্তি করুন:

    static void Main(string[] args)
    {
        foreach (var trip in CreatePossibleTrips())
        {
            // possible trip is actually calculated only at this point, because of yield
            if (IsTripGood(trip))
            {
                // match good trip
            }
        }
    }

আপনি যদি উৎপাদনের পরিবর্তে তালিকা ব্যবহার করেন তবে আপনাকে মেমরির জন্য (1 মিলিয়ন ডলার) 10 মিলিয়ন অবজেক্ট বরাদ্দ করতে হবে এবং এই সাধারণ উদাহরণটি চালাতে 1400 ডলার লাগবে। তবে, আপনি যদি ফলন ব্যবহার করেন তবে আপনার এই সমস্ত অস্থায়ী বস্তুগুলিকে মেমরির মধ্যে রাখার দরকার নেই এবং আপনি উল্লেখযোগ্যভাবে দ্রুত অ্যালগোরিদমের গতি পাবেন: এই উদাহরণটি কোনও মেমরির খরচ ছাড়াই চলতে কেবল 400 ডলার লাগবে।


2
আড়ালে কি ফলন হয়? আমি মনে করি এটি একটি তালিকা, সুতরাং এটি কীভাবে মেমরির ব্যবহারের উন্নতি করবে?
রোলস

1
@ রোলগুলি yieldঅভ্যন্তরীণভাবে একটি রাষ্ট্রীয় যন্ত্র প্রয়োগ করে কভারের আওতায় কাজ করে। এখানে 3 টি এমএসডিএন ব্লগ পোস্ট সহ একটি এসও উত্তর রয়েছে যা কার্যকরভাবে বিশদভাবে ব্যাখ্যা করে। লিখেছেন রেমন্ড চেন @ এমএসএফটি
শিব

13

কোডের দুটি টুকরা সত্যিই দুটি আলাদা জিনিস করছে। প্রথম সংস্করণ সদস্যদের আপনার প্রয়োজন হিসাবে টানবে। দ্বিতীয় সংস্করণ আপনি এর সাথে কিছু করা শুরু করার আগে সমস্ত ফলাফল মেমোরিতে লোড করবে।

এটির কোনও সঠিক বা ভুল উত্তর নেই। কোনটি পছন্দনীয় তা কেবল পরিস্থিতির উপর নির্ভর করে। উদাহরণস্বরূপ, যদি আপনার কোয়েরিটি শেষ করতে হয় এবং ফলাফলগুলি নিয়ে আপনাকে অর্ধ-জটিল কিছু করা দরকার হয় তবে দ্বিতীয় সংস্করণটি পছন্দনীয় হতে পারে। তবে বড় রেজাল্টস থেকে সাবধান থাকুন, বিশেষত যদি আপনি এই কোডটি 32-বিট মোডে চালাচ্ছেন। এই পদ্ধতিটি করার সময় আমি বেশ কয়েকবার আউটওফেমোরি ব্যতিক্রম দ্বারা কামড়েছি।

মূল বিষয়টি মনে রাখতে হবে যদিও: পার্থক্যগুলি দক্ষতার মধ্যে রয়েছে। সুতরাং, আপনার সম্ভবত যে কোনও একটি আপনার কোডকে সহজ করে তোলে এবং কেবল প্রোফাইলিংয়ের পরে এটি পরিবর্তন করা উচিত।


11

ফলন দুটি দুর্দান্ত ব্যবহার আছে

এটি অস্থায়ী সংগ্রহ সংগ্রহ করে কাস্টম পুনরাবৃত্তি সরবরাহ করতে সহায়তা করে। (সমস্ত ডেটা লোড করা এবং লুপিং)

এটি রাষ্ট্রীয় পুনরাবৃত্তি করতে সহায়তা করে। (স্ট্রিমিং)

উপরের দুটি বিষয়টিকে সমর্থন করার জন্য নীচে একটি সাধারণ ভিডিও যা আমি পুরো প্রদর্শন সহ তৈরি করেছি

http://www.youtube.com/watch?v=4fju3xcm21M


10

এই কি ক্রিস বিক্রি ঐ বিবৃতি সম্পর্কে বলছেন সি # প্রোগ্রামিং ভাষা ;

আমি মাঝে মাঝে ভুলে যাই যে ফলন ফেরত রিটার্নের মতো হয় না, ফলন ফেরতের পরে কোডটি কার্যকর করা যায়। উদাহরণস্বরূপ, এখানে প্রথম রিটার্নের পরে কোডটি কখনই কার্যকর করা যায় না:

    int F() {
return 1;
return 2; // Can never be executed
}

বিপরীতে, এখানে প্রথম ফলন ফেরতের পরে কোডটি কার্যকর করা যেতে পারে:

IEnumerable<int> F() {
yield return 1;
yield return 2; // Can be executed
}

এটি প্রায়শই আমাকে একটি বিবৃতিতে কামড় দেয়:

IEnumerable<int> F() {
if(...) { yield return 1; } // I mean this to be the only
// thing returned
yield return 2; // Oops!
}

এই ক্ষেত্রে, মনে রাখবেন যে ফলন ফেরত "চূড়ান্ত" নয় যেমন প্রত্যাবর্তন সহায়ক।


অস্পষ্টতা কমাতে দয়া করে যখন আপনি বলতে পারবেন তা স্পষ্ট করে বলুন, সেটাই হবে, নাকি শক্তিশালী? প্রথমবারের পক্ষে ফিরে আসা এবং দ্বিতীয় ফলনটি কার্যকর করা সম্ভব নয় কি?
জনো ক্রফোর্ড

আইএনএমেরেবলের দ্বিতীয় / পরবর্তী মান গণনা করা হলে কেবল জোজনক্রাফোর্ড দ্বিতীয় ফলন বিবরণী কার্যকর করতে পারে। এটি সম্পূর্ণরূপে সম্ভব যে এটি অভ্যাস করবে না, যেমন F().Any()- এটি কেবল প্রথম ফলাফলটি গণনার চেষ্টা করার পরে ফিরে আসবে। সাধারণভাবে, আপনি IEnumerable yieldপ্রোগ্রামের অবস্থা পরিবর্তন করার উপর নির্ভর করবেন না , কারণ এটি সম্ভবত ট্রিগার হতে পারে না
জ্যাক ফারাঘর

8

আপনার পণ্যগুলি ধরে ধরেই লিনকিউ ক্লাস গণনা / পুনরাবৃত্তির জন্য একই ফলন ব্যবহার করে, প্রথম সংস্করণটি আরও কার্যকর কারণ এটি প্রতিবার পুনরাবৃত্তি হওয়ার পরে এটির একমাত্র ফলন হয়।

দ্বিতীয় উদাহরণটি ToList () পদ্ধতির সাহায্যে তালিকাভুক্ত / পুনরুক্তিকে একটি তালিকায় রূপান্তর করা। এর অর্থ এটি গণকের সমস্ত আইটেমের উপর ম্যানুয়ালি পুনরাবৃত্তি করে এবং তারপরে একটি ফ্ল্যাট তালিকা প্রদান করে।


8

এটি বিন্দুটি ছাড়াও দয়ালু, তবে যেহেতু প্রশ্নটি সেরা-অনুশীলনগুলিতে ট্যাগ করা হয়েছে আমি এগিয়ে গিয়ে আমার দুটি সেন্টে ফেলে দেব। এই ধরণের জিনিসটির জন্য আমি এটিকে একটি সম্পত্তি হিসাবে তৈরি করতে বেশি পছন্দ করি:

public static IEnumerable<Product> AllProducts
{
    get {
        using (AdventureWorksEntities db = new AdventureWorksEntities()) {
            var products = from product in db.Product
                           select product;

            return products;
        }
    }
}

অবশ্যই, এটি কিছুটা বেশি বয়লার-প্লেট তবে এটি যে কোডটি ব্যবহার করে তা দেখতে আরও ক্লিনার দেখবে:

prices = Whatever.AllProducts.Select (product => product.price);

বনাম

prices = Whatever.GetAllProducts().Select (product => product.price);

দ্রষ্টব্য: আমি এমন কোনও পদ্ধতির জন্য এটি করব না যা তাদের কাজটি করতে কিছুটা সময় নিতে পারে।


7

এবং এই সম্পর্কে কি?

public static IEnumerable<Product> GetAllProducts()
{
    using (AdventureWorksEntities db = new AdventureWorksEntities())
    {
        var products = from product in db.Product
                       select product;

        return products.ToList();
    }
}

আমার ধারণা এটি অনেক পরিষ্কার clean যদিও চেক করার জন্য আমার কাছে হাতে ভিএস 2003 নেই। যে কোনও ক্ষেত্রে, যদি পণ্যগুলি আইনুনামেবল প্রয়োগ করে (যেমন মনে হয় - এটি একটি পূর্ববর্তী বিবৃতিতে ব্যবহৃত হয়), তবে আমি এটি সরাসরি ফিরিয়ে দেব।


2
উত্তর পোস্ট করার পরিবর্তে আরও তথ্য অন্তর্ভুক্ত করতে ওপি সম্পাদনা করুন।
ব্রায়ান রাসমুসেন

ঠিক আছে, আপনাকে আমাকে বলতে হবে যে ওপি ঠিক কী দাঁড়ায় :-) ধন্যবাদ
পেটার কে।

আসল পোস্ট, আমি ধরে নিই। আমি পোস্টগুলি সম্পাদনা করতে পারি না, সুতরাং এটি যাওয়ার উপায় বলে মনে হয়েছিল।
পেটার কে।

5

আমি এই ক্ষেত্রে কোড 2 সংস্করণ ব্যবহার করতে হবে। যেহেতু আপনার কাছে পণ্যগুলির সম্পূর্ণ তালিকা উপলব্ধ রয়েছে এবং এই পদ্ধতি কলটির "ভোক্তা" তার দ্বারা প্রত্যাশিত, তাই সম্পূর্ণ তথ্যটি কলারের কাছে ফেরত পাঠানো প্রয়োজন।

যদি এই পদ্ধতির কলকারীকে একবারে "এক" তথ্য প্রয়োজন হয় এবং পরবর্তী তথ্যের ব্যবহার অন চাহিদার ভিত্তিতে হয়, তবে ফলন রিটার্ন ব্যবহার করা উপকারী হবে যা নিশ্চিত করে যে মৃত্যুদন্ড কার্যকর করার আদেশটি কলকারীকে ফিরিয়ে দেওয়া হবে যখন তথ্য এক ইউনিট উপলব্ধ।

কিছু উদাহরণ যেখানে কেউ ফলন ফেরতের ব্যবহার করতে পারে তা হ'ল:

  1. জটিল, ধাপে ধাপে গণনা যেখানে কলার একবারে একটি পদক্ষেপের ডেটার জন্য অপেক্ষা করে
  2. জিইউআইতে পেজিং - যেখানে ব্যবহারকারী কখনও শেষ পৃষ্ঠায় পৌঁছাতে পারে না এবং কেবলমাত্র বর্তমান উপ পৃষ্ঠায় তথ্য উপ-সেট প্রকাশ করা প্রয়োজন

আপনার প্রশ্নের উত্তর দিতে, আমি 2 সংস্করণটি ব্যবহার করতাম।


3

সরাসরি তালিকা ফিরিয়ে দিন। উপকারিতা:

  • এটা আরও পরিষ্কার
  • তালিকাটি পুনরায় ব্যবহারযোগ্য। (পুনরুক্তিকারী নয়) প্রকৃত পক্ষে সত্য নয়, ধন্যবাদ জন

আপনার পুনরুক্তি (ফলন) ব্যবহার করা উচিত যখন থেকে আপনি সম্ভবত মনে করেন যে আপনাকে সম্ভবত তালিকাটির শেষের দিকে পুরোপুরি পুনরাবৃত্তি করতে হবে না বা যখন এর কোনও শেষ নেই। উদাহরণস্বরূপ, ক্লায়েন্ট কলিং প্রথম পণ্যটির সন্ধান করবে যা কিছু শিকারীকে সন্তুষ্ট করে, আপনি পুনরুক্তি ব্যবহারের বিষয়টি বিবেচনা করতে পারেন, যদিও এটি একটি স্বীকৃত উদাহরণ, এবং সম্ভবত এটি সম্পাদনের আরও ভাল উপায় রয়েছে। মূলত, আপনি যদি আগে থেকেই জানেন যে পুরো তালিকাটি গণনা করা দরকার তবে কেবল সামনে do আপনি যদি ভাবেন যে এটি হবে না, তবে পুনরাবৃত্তকারী সংস্করণ ব্যবহার করে বিবেচনা করুন।


ভুলে যাবেন না যে এটি আইনিউমেবল <T> এ ফিরে আসছে, কোনও আইনিউমেটর নয় <T> - আপনি আবার getEnumerator কল করতে পারেন।
জন স্কিটি

আপনি যদি আগে থেকেই জানেন তবে পুরো তালিকাটি গণনা করা দরকার তবে ফলন রিটার্ন ব্যবহার করা উপকারী হতে পারে। একটি উদাহরণ যখন সংগ্রহে কয়েক হাজার আইটেম থাকে।
Val,

1

ফলন ফেরতের কীফ্রেস নির্দিষ্ট সংগ্রহের জন্য রাজ্য মেশিন বজায় রাখতে ব্যবহৃত হয়। সিএলআর যেখানেই ফলন ফেরতের কীফ্রেস ব্যবহার হচ্ছে তা দেখতে পায়, সিএলআর সেই কোডের টুকরোটিতে একটি পরিমিতি প্যাটার্ন প্রয়োগ করে। এই জাতীয় প্রয়োগটি বিকাশকারীকে সমস্ত ধরণের নদীর গভীরতানির্ণয় থেকে সহায়তা করে যা কীওয়ার্ডের অভাবে আমাদের অন্যথায় করতে হবে।

ধরুন, বিকাশকারী যদি কিছু সংগ্রহ ফিল্টার করছে, সংগ্রহটি পুনরাবৃত্তি করছে এবং তারপরে কিছু নতুন সংগ্রহের মধ্যে সেই বস্তুগুলি বের করছে। এই জাতীয় নদীর গভীরতানির্ণয় বেশ একঘেয়ে।

কীওয়ার্ড সম্পর্কে আরও এই নিবন্ধে


-4

ফলনের ব্যবহার কীওয়ার্ড রিটার্নের সমান , এটি ব্যতীত কোনও জেনারেটর ফেরত দেয় । এবং জেনারেটর অবজেক্টটি কেবল একবারে অতিক্রম করবে ।

ফলন দুটি লাভ আছে:

  1. আপনার এই মানগুলি দুবার পড়ার দরকার নেই;
  2. আপনি অনেকগুলি শিশু নোড পেতে পারেন তবে সেগুলি মেমরির মধ্যে রাখবেন না।

আরেকটি স্পষ্ট ব্যাখ্যা সম্ভবত আপনাকে সাহায্য করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.