আমি কীভাবে একটি খালি IEnumerable ফিরিয়ে দিতে পারি?


329

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

পদ্ধতিটি এখানে:

public IEnumerable<Friend> FindFriends()
        {
            //Many thanks to Rex-M for his help with this one.
            //https://stackoverflow.com/users/67/rex-m

            return doc.Descendants("user").Select(user => new Friend
            {
                ID = user.Element("id").Value,
                Name = user.Element("name").Value,
                URL = user.Element("url").Value,
                Photo = user.Element("photo").Value
            });
        }

যেহেতু সবকিছুই রিটার্ন স্টেটমেন্টের ভিতরে থাকে তাই আমি জানি না যে আমি এটি কীভাবে করতে পারি। এই কাজ ভালো কিছু কি?

public IEnumerable<Friend> FindFriends()
        {
            //Many thanks to Rex-M for his help with this one.
            //https://stackoverflow.com/users/67/rex-m
            if (userExists)
            {
                return doc.Descendants("user").Select(user => new Friend
                {
                    ID = user.Element("id").Value,
                    Name = user.Element("name").Value,
                    URL = user.Element("url").Value,
                    Photo = user.Element("photo").Value
                });
            }
            else
            { 
                return new IEnumerable<Friend>();
            }
        }

উপরের পদ্ধতিটি কাজ করে না, এবং বাস্তবে এটি অনুমিত নয়; আমি কেবল অনুভব করি এটি আমার উদ্দেশ্যগুলি তুলে ধরে। আমি মনে করি যে কোডটি কাজ করে না বলে আমার উল্লেখ করা উচিত কারণ আপনি কোনও বিমূর্ত শ্রেণির উদাহরণ তৈরি করতে পারবেন না।

এখানে কলিং কোডটি রয়েছে, আমি চাই না যে এটি যে কোনও সময় শূন্যতম পরিমাণে পাওয়া যায়:

private void SetUserFriends(IEnumerable<Friend> list)
        {
            int x = 40;
            int y = 3;


            foreach (Friend friend in list)
            {
                FriendControl control = new FriendControl();
                control.ID = friend.ID;
                control.URL = friend.URL;
                control.SetID(friend.ID);
                control.SetName(friend.Name);
                control.SetImage(friend.Photo);

                control.Location = new Point(x, y);
                panel2.Controls.Add(control);

                y = y + control.Height + 4;
            } 

        }

সময় দেয়ার জন্য ধন্যবাদ.


2
কোডটি এখানে খুঁজছেন আপনি ফলন ফেরত এবং ফলন বিরতি ব্যবহার করা উচিত।
ক্রিস মেরিসিক

উত্তর:


575

আপনি ব্যবহার করতে পারেন list ?? Enumerable.Empty<Friend>(), বা FindFriendsফিরে আসতে পারেনEnumerable.Empty<Friend>()


7
যদি সে ফিরে আসে তবে কি জিনিসগুলির পরিবর্তন new List<Friend>()হবে IEnumerable<Friend>?
সারা ভেসেলগুলি

73
new List<Friend>()এটি আরও ব্যয়বহুল অপারেশন কারণ এটি একটি তালিকার একটি উদাহরণ তৈরি করবে (এবং প্রক্রিয়াটিতে এটির জন্য মেমরি বরাদ্দ করবে)
ইগোর পশুকুক


105

আমার হিসাবে, সবচেয়ে মার্জিত উপায় হয় yield break


8
আপনি যদি ফলন রিটার্ন এবং এই জাতীয় ব্যবহার করেন তবে তাই না?
Svish

15
তাঁর কোড হিসাবে +1 এর সঠিকভাবে ফলন ব্যবহার করা উচিত তিনি যেভাবে কাজ করছেন তার জন্য ফলশ্রুতি
ক্রিস মেরিসিক

6
বিষয়টি সম্পর্কে আমার অজ্ঞতা ক্ষমা করুন, তবে আপনি কী অনুগ্রহ করে এই প্রসঙ্গে ফলন বিরতি ব্যবহার করবেন তা ব্যাখ্যা করতে পারেন? আমি কেবল লুপগুলির জন্য উদাহরণগুলি দেখেছি তবে এটি আমার জন্য একটি পরিষ্কার ছবি আঁকেনি।
সার্জিও তাপিয়া

একটি উদাহরণ সহ উত্তর আপডেট। সত্যিই এটি করার সবচেয়ে মার্জিত উপায় হ'ল আমি সম্মত হব। :)
জনি স্কোভডাল

4
পিয়ারের পর্যালোচনাতে সম্পাদনা প্রত্যাখ্যান করা হয়েছে, সুতরাং এখানে আমি উদাহরণ হিসাবেছিলাম পাইরিটির কথা - ফর্ম্যাটটি যদিও গণ্ডগোল হয়ে যায়, তাই আমি এটিকে পেস্টবিন.public IEnumerable<Friend> FindFriends() { if(!userExists) yield break; foreach(var descendant in doc.Descendants("user").Select(user => new Friend { ID = user.Element("id").Value, Name = user.Element("name").Value, URL = user.Element("url").Value, Photo = user.Element("photo").Value })) { yield return descendant; } }
com/ এক্স

8

এটি অবশ্যই ব্যক্তিগত পছন্দের বিষয়, তবে আমি ফলন রিটার্ন ব্যবহার করে এই ফাংশনটি লিখব:

public IEnumerable<Friend> FindFriends()
{
    //Many thanks to Rex-M for his help with this one.
    //http://stackoverflow.com/users/67/rex-m
    if (userExists)
    {
        foreach(var user in doc.Descendants("user"))
        {
            yield return new Friend
                {
                    ID = user.Element("id").Value,
                    Name = user.Element("name").Value,
                    URL = user.Element("url").Value,
                    Photo = user.Element("photo").Value
                }
        }
    }
}

1

আমি মনে করি সহজ উপায় হবে

 return new Friend[0];

রিটার্নের প্রয়োজনীয়তাগুলি কেবলমাত্র সেই পদ্ধতিটি কার্যকর করে এমন কোনও বস্তু ফেরত দেয় IEnumerable<Friend>। যেহেতু উভয়ই আইএনিউমারেবল প্রয়োগ করে যতক্ষণ না বিভিন্ন পরিস্থিতিতে আপনি দুটি ভিন্ন ধরণের অবজেক্ট ফিরিয়ে দেন তা অপ্রাসঙ্গিক।


5
গণনাকারী।সম্পূর্ণ <T> একই টি খালি অ্যারে পুনঃব্যবহারের সুবিধার সাথে টি (টি [0]) এর খালি অ্যারেটি দেয়। নোট করুন যে এই পদ্ধতিটি খালি নয় এমন অ্যারেগুলির জন্য আদর্শ নয়, কারণ উপাদানগুলিকে সংশোধন করা যেতে পারে (তবে একটি অ্যারে পুনরায় আকার দেওয়া যায় না, পুনরায় আকার দেওয়ার সাথে একটি নতুন উদাহরণ তৈরি করা জড়িত)।
ফ্রান্সিস গাগনি

0
public IEnumerable<Friend> FindFriends()
{
    return userExists ? doc.Descendants("user").Select(user => new Friend
        {
            ID = user.Element("id").Value,
            Name = user.Element("name").Value,
            URL = user.Element("url").Value,
            Photo = user.Element("photo").Value
        }): new List<Friend>();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.