() বনাম কোথায় () প্রথম ফার্স্ট ডিফল্ট ()


161

আমি প্রায়শই লোকজনকে Where.FirstOrDefault()অনুসন্ধান করতে ব্যবহার করে এবং প্রথম উপাদানটি দখল করতে দেখি । শুধু ব্যবহার Find()করবেন না কেন ? অন্যের কি কোনও সুবিধা আছে? আমি একটা পার্থক্য বলতে পারলাম না।

namespace LinqFindVsWhere
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> list = new List<string>();
            list.AddRange(new string[]
            {
                "item1",
                "item2",
                "item3",
                "item4"
            });

            string item2 = list.Find(x => x == "item2");
            Console.WriteLine(item2 == null ? "not found" : "found");
            string item3 = list.Where(x => x == "item3").FirstOrDefault();
            Console.WriteLine(item3 == null ? "not found" : "found");
            Console.ReadKey();
        }
    }
}

45
এফডাব্লুআইডাব্লু, এবং list.FirstOrDefault(x => x == "item3");উভয় ব্যবহারের চেয়ে সংক্ষিপ্ত । .Where.FirstOrDefault
কર્ક ভোল

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

8
Findলিনকিউর পূর্বাভাস দেয়। (এটি .NET 2.0 এ উপলব্ধ ছিল এবং আপনি ল্যাম্বডাস ব্যবহার করতে পারেন নি You আপনি সাধারণ পদ্ধতি বা বেনামে পদ্ধতি ব্যবহার করতে বাধ্য হন)
কर्क ওল

উত্তর:


204

Findপদ্ধতিটি কোথায় চলছে IEnumerable<T>? (তাত্ত্বিক প্রশ্ন.)

Whereএবং FirstOrDefaultপদ্ধতি ক্রম একাধিক ধরণের সহ, বিরুদ্ধে প্রযোজ্য List<T>, T[], Collection<T>, ইত্যাদি কোন ক্রম যে কার্যকরী IEnumerable<T>এই পদ্ধতি ব্যবহার করতে পারেন। Findশুধুমাত্র জন্য উপলব্ধ List<T>। যে পদ্ধতিগুলি সাধারণত অধিকতর প্রযোজ্য সেগুলি আরও পুনরায় ব্যবহারযোগ্য এবং এর আরও বেশি প্রভাব পড়ে।

আমার ধারণা আমার পরবর্তী প্রশ্নটি হ'ল তারা কেন অনুসন্ধানটি যুক্ত করলেন। এটি একটি ভাল টিপ। আমি কেবল ভাবতে পারি যে ফার্স্টঅরডেফল্ট নাল ব্যতীত অন্য কোনও ডিফল্ট মান দিতে পারে। অন্যথায় এটি কেবল অর্থহীন সংযোজনের মতো মনে হয়

Find চালু List<T> অন্যান্য পদ্ধতি predates। List<T>.NET 2.0 এ জেনেরিকের সাথে যুক্ত করা Findহয়েছিল এবং সেই শ্রেণীর API এর অংশ ছিল। Whereএবং লিনকের সাথে FirstOrDefaultএক্সটেনশন পদ্ধতি হিসাবে যুক্ত করা হয়েছিল IEnumerable<T>যা পরে। নেট সংস্করণ। আমি দৃty়তার সাথে বলতে পারি না যে লিঙ্কের উপস্থিতি যদি 2.0 রিলিজের সাথে থাকে তবে Findতা কখনই যুক্ত করা যেত না, তবে এটি পূর্ববর্তী সংস্করণগুলির দ্বারা অপ্রচলিত বা অপ্রয়োজনীয় তৈরি করা নেট সংস্করণাগুলির পূর্ববর্তী অনেকগুলি বৈশিষ্ট্যের ক্ষেত্রে তর্কাতীত বিষয়।


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

4
তবে Where(condition).FirstOrDefault()কমপক্ষে পাশাপাশি এবং কখনও কখনও FirstOrDefault(condition)একাকী থেকেও ভাল optim Where()উপলব্ধ থাকাকালীন আমরা উন্নত কর্মক্ষমতা পেতে সর্বদা ব্যবহার করি ।
সানক্যাট 2000

7
@ সানকাট 2000 দয়া করে একটি উদাহরণ সরবরাহ করুন
কনস্টান্টিন সালাভাতভ

2
@ সানকাট 2000 আপনি লিনাকটি এর অভিব্যক্তিপূর্ণ শক্তিটি ব্যবহার করছেন এবং ঘোষিত কোড লিখতে চান। ভবিষ্যতের বাস্তবায়নেও পরিবর্তিত হতে পারে এমন মাইক্রো উন্নতি নিয়ে আপনার উদ্বিগ্ন হওয়া উচিত নয়। এছাড়াও, খুব তাড়াতাড়ি অপ্টিমাইজ করবেন না
পাইট্র ফ্যালকভস্কি

50

আমি শুধু আজ খুঁজে পাওয়া যায় নি, 80K অবজেক্টের একটি তালিকায় কিছু পরীক্ষার করছেন এবং দেখা যায় যে Find()দ্রুত একটি ব্যবহার 1000% পর্যন্ত হতে পারে Whereসঙ্গে FirstOrDefault()। প্রত্যেকের আগে এবং পরে টাইমার পরীক্ষা করা পর্যন্ত আমি জানতাম না। কখনও কখনও এটি একই সময় ছিল, অন্যথায় এটি দ্রুত ছিল।


6
আপনি কোথায় এবং ফার্স্টআরডিফল্ট দিয়ে চেষ্টা করেছেন? আপনি যদি কেবলমাত্র প্রথম ফার্স্ট ডিফল্ট দিয়ে চেষ্টা করে থাকেন এবং দেখুন () এখনও আরও ভাল।
এমভিসি কার্ল

5
মনে হচ্ছে আপনি কোনওটি দিয়ে ফলাফলটি বাস্তবায়িত করেন নি .ToList()বা .ToArray()আসলে ক্যোয়ারীটি সম্পাদন করেছেন।
অ্যান্ড্রু মর্টন

4
এটি কারণ কারণ Findপ্রাথমিক কীগুলি ব্যবহার করে (অতএব সূচকগুলি), যেখানে Whereএকটি সরল
স্কেল

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

2
ঠিক আছে, এই পারফরম্যান্সের উন্নতি হ'ল কারণ () ডিবিতে আঘাত করার আগে বস্তুর জন্য ক্যাশে চেক করুন যেখানে () সর্বদা অবজেক্ট পেতে ডিবি যেতে হবে
গৌরব

35

তথ্যের উত্স হ'ল সত্তা ফ্রেমওয়ার্ক হ'ল খুব গুরুত্বপূর্ণ পার্থক্য আছে: Find'যুক্ত' অবস্থায় সত্তা সন্ধান করবে যা এখনও অব্যাহত নয়, কিন্তু Whereথাকবে না। এটি নকশা দ্বারা।



1

Where()সমস্ত রেকর্ডের মাধ্যমে অ্যান্টনি উত্তর দেখার পরে এবং ফলাফল (গুলি) ফেরত দেওয়া Find()উচিত যখন প্রদত্ত প্রাকটিকের সাথে শিকারী ম্যাচ হলে সমস্ত রেকর্ডের মধ্য দিয়ে যেতে হবে না।

সুতরাং বলুন যে আপনি টেস্ট ক্লাস থাকার idএবং nameবৈশিষ্ট্য তালিকা আছে ।

 List<Test> tests = new List<Test>();
 tests.Add(new Test() { Id = 1, Name = "name1" });
 tests.Add(new Test() { Id = 2, Name = "name2" });
 tests.Add(new Test() { Id = 3, Name = "name3" });
 tests.Add(new Test() { Id = 4, Name = "name2" }); 
 var r = tests.Find(p => p.Name == "name2");
 Console.WriteLine(r.Id);

ফলাফল দেয় 2, এবং শুধুমাত্র 2 টি পরিদর্শন দেয় ফলাফল দেয়, তবে আপনি যদি ব্যবহার করেন তবেWhere().FirstOrDefault() তবে আমরা সমস্ত রেকর্ড পরিদর্শন করব এবং তারপরে আমরা ফলাফল পাব।

সুতরাং, যখন আপনি জানেন যে আপনি কেবল সংগ্রহের রেকর্ডগুলি থেকে প্রথম ফলাফল চান Find()তখন আরও উপযুক্ত হবেWhere().FirtorDefault();


4
তবে আপনি যদি কোথায় () ব্যবহার করেন First নাঃ। FirstOrDefaultচেইনকে 'বুদ্বুদ-আপ' করবে এবং সমস্ত কিছু গণনা বন্ধ করবে। আমি 'বাবল-আপ' শব্দটি আরও ভাল প্রকাশের অভাবের জন্য ব্যবহার করি কারণ প্রকৃতপক্ষে প্রতিটি নির্বাচক / প্রিডিকেট পরেরটিতে চলে যাবে, সুতরাং শৃঙ্খলে সর্বশেষ পদ্ধতিটি প্রথমে কাজ করছে।
সিলভারমাইন্ড

1

বাহ আমি আজ ইউটিউবে মাইক্রোসফটুলবক্সের EF টিউটোরিয়ালটি দেখি। তিনি অনুসন্ধান () এবং ফার্স্টআরডিফল্ট (শর্ত) কোয়েরিতে ব্যবহার করার বিষয়ে বলেছিলেন এবং ফাইন্ড () সেই অবজেক্টে আপনি যে ডেটা করেছেন তা অনুসন্ধান করবেন (যোগ বা সম্পাদনা বা মুছুন - তবে এখনও ডেটাবেজে সংরক্ষণ করা হয়নি) এর মধ্যে ফার্স্টঅরডেফল্ট কেবলমাত্র ইতিমধ্যে কি সংরক্ষিত হয়েছে তা দেখুন


-1

Find()এর একটি মূল সমতুল্য FirstOrDefault()। আপনি উভয় শৃঙ্খল করা উচিত নয়। যেখানে () এর সাথে .FirstOrDefault()কারণ .Where()পুরো অ্যারের মাধ্যমে যায় এবং তারপরে প্রথম আইটেমটি সন্ধানের জন্য সেই তালিকাটির মাধ্যমে পুনরাবৃত্তি হবে। আপনি FirstOrDefault()পদ্ধতিটিতে নিজের অনুসন্ধানের শিকারটিকে রেখে অবিশ্বাস্য পরিমাণ সময় সাশ্রয় করেন ।

এছাড়াও, আমি আপনাকে এই থ্রেডের সাথে যুক্ত লিঙ্কটি পড়তে উত্সাহিত করি .Find()যাতে নির্দিষ্ট পরিস্থিতিতে পারফরম্যান্স ফাংশন () বনাম ফার্স্টআরডেফল্ট () এর পারফরম্যান্স ব্যবহার করে আরও ভাল পারফরম্যান্সগুলি সম্পর্কে আরও জানতে পারেন read


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