আইনেমেবল বনাম তালিকা - কী ব্যবহার করবেন? তারা কিভাবে কাজ করে?


676

এনুমरेटरগুলি কীভাবে কাজ করে এবং লিনকিউ নিয়ে আমার কিছু সন্দেহ আছে। এই দুটি সহজ নির্বাচন বিবেচনা করুন:

List<Animal> sel = (from animal in Animals 
                    join race in Species
                    on animal.SpeciesKey equals race.SpeciesKey
                    select animal).Distinct().ToList();

অথবা

IEnumerable<Animal> sel = (from animal in Animals 
                           join race in Species
                           on animal.SpeciesKey equals race.SpeciesKey
                           select animal).Distinct();

আমি আমার মূল অবজেক্টের নাম পরিবর্তন করেছি যাতে এটি আরও সাধারণ উদাহরণের মতো দেখায় like ক্যোয়ারী নিজেই তেমন গুরুত্বপূর্ণ নয়। আমি যা জানতে চাই তা হ'ল:

foreach (Animal animal in sel) { /*do stuff*/ }
  1. আমি লক্ষ্য করেছি যে আমি যদি IEnumerable"সেল" ডিবাগ করি এবং পরিদর্শন করি, যা সেই ক্ষেত্রে আইনিউবারেবল হয়, তবে এর কিছু আকর্ষণীয় সদস্য রয়েছে: "অন্তর্", "বহিরাগত", "অভ্যন্তরীণকেশিলেক্টর" এবং "আওয়ারকিকিলেক্টর", এই শেষ 2 প্রদর্শিত হবে প্রতিনিধি হতে। "অভ্যন্তরীণ" সদস্যটির এতে "প্রাণী" উদাহরণ নেই, বরং "স্পেসি" উদাহরণ রয়েছে, যা আমার পক্ষে খুব অদ্ভুত ছিল। "বহিরাগত" সদস্যটিতে "প্রাণী" উদাহরণ রয়েছে। আমি অনুমান করি যে দুটি প্রতিনিধি নির্ধারণ করে কোনটি ভিতরে যায় এবং এর মধ্যে কী ঘটে?

  2. আমি লক্ষ্য করেছি যে আমি যদি "ডিসট্রিন্ট" ব্যবহার করি তবে "অভ্যন্তরীণ" টিতে 6 টি আইটেম রয়েছে (এটি কেবল 2 টি পৃথক হিসাবে ভুল) তবে "বাইরের "টিতে সঠিক মান থাকে। আবার, সম্ভবত নির্ধারিত পদ্ধতিগুলি এটি নির্ধারণ করে তবে আমি আইনামেবল সম্পর্কে আমার চেয়ে কিছুটা বেশি।

  3. সবচেয়ে বড় কথা, দুটি পারফরম্যান্সের মধ্যে কোনটি সেরা পারফরম্যান্স অনুযায়ী?

মাধ্যমে মন্দ তালিকা রূপান্তর .ToList()?

নাকি সরাসরি এনুমুলেটর ব্যবহার করছেন?

যদি আপনি পারেন তবে দয়া করে কিছুটা ব্যাখ্যা করুন বা এমন কিছু লিঙ্ক নিক্ষেপ করুন যা এই পরিমাণে ব্যবহারের ব্যাখ্যা দেয় explain

উত্তর:


738

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

আমি যখনই লিনকিউ এক্সপ্রেশনগুলিকে "স্ট্যাকিং" করি, আমি ব্যবহার করি IEnumerable, কারণ কেবলমাত্র আচরণটি নির্দিষ্ট করেই আমি লিনকুইকে মূল্যায়ন স্থগিত করার এবং সম্ভাব্যভাবে প্রোগ্রামটি অনুকূলকরণের সুযোগ দিয়ে থাকি। মনে রাখবেন যে লিনকিউ ডাটাবেসটিকে গণনা না করা পর্যন্ত কীভাবে এসকিউএল তৈরি করে না? এই বিবেচনা:

public IEnumerable<Animals> AllSpotted()
{
    return from a in Zoo.Animals
           where a.coat.HasSpots == true
           select a;
}

public IEnumerable<Animals> Feline(IEnumerable<Animals> sample)
{
    return from a in sample
           where a.race.Family == "Felidae"
           select a;
}

public IEnumerable<Animals> Canine(IEnumerable<Animals> sample)
{
    return from a in sample
           where a.race.Family == "Canidae"
           select a;
}

এখন আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা প্রাথমিক নমুনা ("AllSpotted") এবং আরও কিছু ফিল্টার নির্বাচন করে। সুতরাং এখন আপনি এটি করতে পারেন:

var Leopards = Feline(AllSpotted());
var Hyenas = Canine(AllSpotted());

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

একটি প্রোগ্রামে, আপনার ক্যোয়ারীটিকে শেষের দিকে তালিকায় রূপান্তর করা স্থগিত করা ভাল, সুতরাং আমি যদি চিতাবাঘ এবং হায়েনাসের মাধ্যমে একাধিকবার গণনা করতে যাচ্ছি তবে আমি এটি করতাম:

List<Animals> Leopards = Feline(AllSpotted()).ToList();
List<Animals> Hyenas = Canine(AllSpotted()).ToList();

11
আমি মনে করি তারা একটি যোগদানের দুটি পক্ষকে বোঝায়। যদি আপনি "প্রজাতি থেকে প্রজাতিগুলি নির্বাচন করুন ..." করেন তবে জয়েন্টটির অভ্যন্তরীণ অংশটি হ'ল অ্যানিমাল, এবং বাইরের অংশটি স্পেসিস।
ক্রিস ওয়েনহ্যাম

10
যখন আমি এইগুলির জন্য উত্তরগুলি পড়েছি: আইনিউমেবল <টি> বনাম আইকোয়্যারেবল <T> আমি অ্যানালগিকাল ব্যাখ্যাটি দেখেছি, যাতে সংগ্রহযোগ্য ক্যোয়ারী করার জন্য আইনামিউরেবল স্বয়ংক্রিয়ভাবে রানটাইমটিকে অবজেক্টগুলিতে LINQ ব্যবহার করতে বাধ্য করে। সুতরাং আমি এই 3 ধরণের মধ্যে বিভ্রান্ত করছি। stackoverflow.com/questions/2876616/…
ব্রোনেক

4
@ ব্রোনেক আপনি যে উত্তরটি যুক্ত করেছেন তা সত্য। IEnumerable<T>প্রথম অংশের পরে লাইনকিউ-টু-অবজেক্টস হবে অর্থাত্ সমস্ত দাগযুক্ত ফাইলাইন চালাতে ফিরে আসতে হবে। অন্যদিকে একটি IQuertable<T>কেবল স্পটড ফিলাইনসকে নীচে টেনে নিয়ে ক্যোরিটিকে পরিমার্জন করার অনুমতি দেবে।
নট

21
এই উত্তরটি খুব বিভ্রান্তিকর! @ নেটের মন্তব্য কেন তা ব্যাখ্যা করেছে। আপনি যদি IEnumerable <T> ব্যবহার করছেন তবে ফিল্টারটি ক্লায়েন্টের পক্ষে ঘটবে যা-ই হোক না কেন।
হ্যানস

5
হ্যাঁ অলস্পটেড () দুটিবার চালানো হবে। এই উত্তরের সাথে আরও বড় সমস্যা হ'ল নিম্নলিখিত বিবৃতিটি: "ঠিক আছে উপরের দিকে, চিতা ও হায়ানাস প্রত্যেকে একক এসকিউএল কোয়েরিতে রূপান্তরিত হয় এবং ডাটাবেস কেবল প্রাসঙ্গিকভাবে সারিগুলি দেয়" " এটি মিথ্যা, কারণ যেখানে ক্লোনটি একটি IEnumerable <> এ কল করা হচ্ছে এবং এটি কেবলমাত্র ডাটাবেস থেকে আগত অবজেক্টগুলির মধ্যে কীভাবে লুপ করবেন তা জানে। আপনি যদি AllSpotted () এবং ফিইন () এবং কাইনাইন () এর প্যারামিটারগুলি আইকোয়্যারেবলে পরিণত করেন তবে ফিল্টারটি এসকিউএলে ঘটবে এবং এই উত্তরটি অর্থবোধ করবে।
হ্যান্স

178

এখানে লেখা একটি খুব ভাল নিবন্ধ আছে: ক্লোদিও বার্নাসকোনির টেকব্লগ এখানে: আইএনমেবল, আইকোলিকেশন, আইলিস্ট এবং তালিকা কখন ব্যবহার করবেন

পরিস্থিতি এবং ফাংশন সম্পর্কে এখানে কিছু বেসিক পয়েন্টস:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


25
এটি উল্লেখ করা উচিত যে এই নিবন্ধটি কেবল আপনার কোডের জনসাধারণের মুখোমুখি অংশগুলির জন্য, অভ্যন্তরীণ কাজকর্মের জন্য নয়। Listএকটি বাস্তবায়ন IListএবং এই ধরনের ঐ উপরে অতিরিক্ত কার্যকারিতা থাকে যেমন IList(যেমন Sort, Find, InsertRange)। আপনি যদি নিজেকে IListঅতিরিক্তভাবে ব্যবহার করতে বাধ্য করেন তবে আপনার Listপ্রয়োজন হতে পারে এই পদ্ধতিগুলি আলগা করুন
জোনাথন টোয়েট

4
ভুলে যাবেন নাIReadOnlyCollection<T>
ডান্ড্রি

2
এটি []এখানে একটি সরল অ্যারে অন্তর্ভুক্ত করা সহায়ক হতে পারে ।
jbyrd

এটি গ্রাহ্য হতে পারে, এই গ্রাফিক এবং নিবন্ধটি ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ
ড্যানিয়েল

133

প্রয়োগকারী একটি শ্রেণি IEnumerableআপনাকে foreachসিনট্যাক্স ব্যবহার করতে দেয় ।

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

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

এখন Listপ্রয়োগ করে IEnumerable, তবে মেমরির পুরো সংগ্রহটি উপস্থাপন করে। আপনার যদি একটি থাকে IEnumerableএবং আপনি কল করেন তবে .ToList()আপনি স্মৃতিতে অঙ্কের বিষয়বস্তু সহ একটি নতুন তালিকা তৈরি করবেন।

আপনার লিনক এক্সপ্রেশনটি একটি গণনা দেয় এবং ডিফল্টরূপে এক্সপ্রেশনটি কার্যকর হয় যখন আপনি ব্যবহার করে পুনরাবৃত্তি করেন foreachIEnumerableআপনি যখন পুনরাবৃত্তি করেন তখন একটি লিনাক স্টেটমেন্ট foreachকার্যকর হয় তবে আপনি এটি ব্যবহার করে তাড়াতাড়ি পুনরাবৃত্তি করতে বাধ্য করতে পারেন .ToList()

আমি যা বলতে চাইছি তা এখানে:

var things = 
    from item in BigDatabaseCall()
    where ....
    select item;

// this will iterate through the entire linq statement:
int count = things.Count();

// this will stop after iterating the first one, but will execute the linq again
bool hasAnyRecs = things.Any();

// this will execute the linq statement *again*
foreach( var thing in things ) ...

// this will copy the results to a list in memory
var list = things.ToList()

// this won't iterate through again, the list knows how many items are in it
int count2 = list.Count();

// this won't execute the linq statement - we have it copied to the list
foreach( var thing in list ) ...

2
তবে আপনি যদি প্রথমে কোনও তালিকায় রূপান্তর না করে কোনও আইএননামারেবলের উপর পূর্বাভাস প্রয়োগ করেন তবে কি হবে ? এটি কি পুরো সংগ্রহটি স্মৃতিতে নিয়ে আসে? বা, ফোরচ লুপটির উপরে পুনরাবৃত্তি হওয়ার সাথে সাথে এটি উপাদানটিকে একে একে ইনস্ট্যান্ট করে? ধন্যবাদ
প্যাপ

@ প্যাটার ল্যাটার্ট: এটি আবার কার্যকর করে, কোনও কিছুই স্বয়ংক্রিয়ভাবে মেমরিতে ক্যাশে হয় না।
কিথ

মনে হয় কী ডিফটি 1) স্মৃতিতে পুরো জিনিস বা না। 2) উল্লেখযোগ্য আমাকে ব্যবহার করতে দিন, foreachযখন তালিকাটি সূচি অনুসারে যাবে। এখন, আমি যদি জানতে চাই COUNT / দৈর্ঘ্য এর thingপূর্বেই IEnumerable সাহায্য করবে না, ঠিক?
Jeb50

@ Jeb50 ঠিক নেই - উভয় Listএবং Arrayবাস্তবায়ন IEnumerable। আপনি IEnumerableসর্বনিম্ন সাধারণ ডিনোমিনেটর হিসাবে ভাবতে পারেন যা মেমরি সংগ্রহ এবং বৃহত্তর উভয়ের জন্য কাজ করে যা একবারে একটি আইটেম পায়। আপনি যখন কল করবেন তখন আপনি IEnumerable.Count()কোনও দ্রুত .Lengthসম্পত্তিকে কল করতে বা পুরো সংগ্রহের মধ্য দিয়ে যাচ্ছেন - বিষয়টি এমনটি যা IEnumerableআপনি জানেন না। এটা একটা সমস্যা হতে পারে, কিন্তু যদি আপনি শুধু করতে যাচ্ছেন foreachতখন আপনি কি দেখেন না - আপনার কোড একটি সঙ্গে কাজ করবে Arrayবা DataReaderএকই।
কীথ

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

97

কেউ একটি গুরুত্বপূর্ণ পার্থক্যের কথা উল্লেখ করেনি, এটির সদৃশ হিসাবে বন্ধ হওয়া একটি প্রশ্নের উত্তেজনাপূর্ণ উত্তর দিয়েছেন।

সংখ্যাযুক্ত কেবল পঠনযোগ্য এবং তালিকাটি নয়।

তালিকা এবং আইউনামেবলের মধ্যে ব্যবহারিক পার্থক্য দেখুন


অনুসরণ হিসাবে, এটি ইন্টারফেস দিকের কারণে বা তালিকার দিকের কারণে? অর্থাৎ আইলিস্টটি কি কেবল পাঠযোগ্য?
জেসন মাস্টার্স

আইলিস্টটি কেবল পঠনযোগ্য নয় - ডকস.মাইক্রোসফট.এইন / ইউএস / ডটনেট / এপি / অযৌক্তিক কেবল পঠনযোগ্য কারণ এটি নির্মাণের পরে কোনও কিছু যুক্ত বা সরাতে কোনও পদ্ধতির অভাব রয়েছে, এটি বেস ইন্টারফেসগুলির মধ্যে একটি যা আইলিস্টটি প্রসারিত হয়েছে (লিঙ্কটি দেখুন)
সিএডি ব্লোক

67

সবচেয়ে গুরুত্বপূর্ণ বিষয়টি বুঝতে হবে যে, লিনক ব্যবহার করে, ক্যোয়ারীটি তাত্ক্ষণিকভাবে মূল্যায়ন করা হবে না। এটা শুধুমাত্র ফলে মাধ্যমে iterating অংশ হিসেবে চালানো হয় IEnumerable<T>একটি foreach- যে কী সব অদ্ভুত প্রতিনিধিদের করছেন।

সুতরাং, প্রথম উদাহরণটি জিজ্ঞাসাটির তাত্ক্ষণিকভাবে কল ToListকরে এবং ক্যোয়ারির ফলাফলগুলিকে একটি তালিকায় রাখার মাধ্যমে মূল্যায়ন করে ।
দ্বিতীয় উদাহরণটি ফেরত দেয় IEnumerable<T>যা পরে কোয়েরি চালানোর জন্য প্রয়োজনীয় সমস্ত তথ্য ধারণ করে।

পারফরম্যান্সের ক্ষেত্রে, উত্তরটি এটি নির্ভর করে । যদি আপনার ফলাফলগুলি একবারে মূল্যায়ণের প্রয়োজন হয় (বলুন, আপনি যে কাঠামোগুলি পরে জিজ্ঞাসা করছেন তা রূপান্তর করছেন, বা যদি আপনি পুনরাবৃত্তিটি IEnumerable<T>দীর্ঘ সময় নিতে চান না ) একটি তালিকা ব্যবহার করুন। অন্যথায় একটি ব্যবহার IEnumerable<T>। ডিফল্টটি হ'ল দ্বিতীয় উদাহরণে অন-চাহিদা মূল্যায়ন ব্যবহার করা উচিত, কারণ এটি সাধারণত মেমরির কম ব্যবহার করে, যদি না তালিকায় ফলাফলগুলি সংরক্ষণের নির্দিষ্ট কারণ থাকে reason


হাই এবং উত্তর দেওয়ার জন্য ধন্যবাদ :: -)। এটি আমার প্রায় সমস্ত সন্দেহ দূর করেছে। কোন ধারণা কেন এনামুরবেল "বিভক্ত" "অভ্যন্তরীণ" এবং "বাহ্যিক"? আমি যখন মাউসের মাধ্যমে ডিবাগ / ব্রেক ব্রেকের উপাদানটি পরীক্ষা করি তখন এটি ঘটে। এটি কি ভিজ্যুয়াল স্টুডিওর অবদান? ঘটনাস্থলে গণনা করা এবং এনামের ইনপুট এবং আউটপুট নির্দেশ করে?
অ্যাকসন

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

40

IEnumerable এর সুবিধা মুলতুবি কার্যকর (সাধারণত ডেটাবেস সহ) হয় with আপনি তথ্যটি লুপ না করা অবধি ক্যোয়ারী কার্যকর করা হবে না। এটি প্রয়োজন না হওয়া পর্যন্ত অপেক্ষা করা একটি ক্যোয়ারী (ওরফে অলস লোডিং)।

যদি আপনি টোললিস্টে কল করেন তবে ক্যোয়ারীটি কার্যকর করা হবে, বা আমি বলতে চাই "" উপাদানযুক্ত "করা হবে।

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


25

আমি একটি অপব্যবহার করা ধারণাটি শেয়ার করব যা আমি একদিনে পড়েছিলাম:

var names = new List<string> {"mercedes", "mazda", "bmw", "fiat", "ferrari"};

var startingWith_M = names.Where(x => x.StartsWith("m"));

var startingWith_F = names.Where(x => x.StartsWith("f"));


// updating existing list
names[0] = "ford";

// Guess what should be printed before continuing
print( startingWith_M.ToList() );
print( startingWith_F.ToList() );

প্রত্যাশিত ফলাফল

// I was expecting    
print( startingWith_M.ToList() ); // mercedes, mazda
print( startingWith_F.ToList() ); // fiat, ferrari

আসল ফলাফল

// what printed actualy   
print( startingWith_M.ToList() ); // mazda
print( startingWith_F.ToList() ); // ford, fiat, ferrari

ব্যাখ্যা

অন্যান্য উত্তর হিসাবে, ফলাফল মূল্যায়ন কল ToListবা অনুরূপ অনুরোধ পদ্ধতি উদাহরণস্বরূপ স্থগিত ছিল ToArray

সুতরাং আমি এই ক্ষেত্রে কোডটি আবার লিখতে পারি:

var names = new List<string> {"mercedes", "mazda", "bmw", "fiat", "ferrari"};

// updating existing list
names[0] = "ford";

// before calling ToList directly
var startingWith_M = names.Where(x => x.StartsWith("m"));

var startingWith_F = names.Where(x => x.StartsWith("f"));

print( startingWith_M.ToList() );
print( startingWith_F.ToList() );

খালি খেলা

https://repl.it/E8Ki/0


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

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

এটি ব্যাখ্যা করার জন্য একটি গুরুত্বপূর্ণ পার্থক্য তবে আপনার "প্রত্যাশিত ফলাফল" সত্যই প্রত্যাশিত নয়। আপনি এটি বলছেন এটি ডিজাইনের পরিবর্তে কিছুটা গোটচা।
নেমে

@Neme, হ্যাঁ এটা আমার প্রত্যাশা ছিল আগে আমি কিভাবে বুঝতে IEnumerableকাজ, কিন্তু যেহেতু আমি জানি এখন না আরো কত;)
AMD

15

আপনি যা করতে চান তা যদি তাদের গণনা করা হয় তবে এটি ব্যবহার করুন IEnumerable

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


1
আমি নিশ্চিত না যে এটি বলা নিরাপদ যে কোনও তালিকা তৈরি করা মানে কম কর্মক্ষমতা।
স্টিভেন সুদিত

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

@ অ্যাক্সন হ্যাঁ, আমি তালিকা তালিকাতে প্রবেশ করি। স্থির করেছি।
ড্যারেন টমাস

@ স্টিভেন যদি আপনি এর উপাদানগুলির উপর পুনরাবৃত্তি করার পরিকল্পনা করেন তবে IEnumerableপ্রথমে একটি তালিকা তৈরি করা (এবং তার উপর পুনরাবৃত্তি করা) এর অর্থ আপনি দুটি বার এলিমেন্টের উপর পুনরাবৃত্তি করতে পারেন । সুতরাং আপনি যদি তালিকায় আরও দক্ষ যে অপারেশনগুলি সম্পাদন করতে না চান তবে এর অর্থ হ'ল কম পারফরম্যান্স।
ড্যারেন টমাস

3
@ জারহয়েট: ক্রমটি পুনরাবৃত্তি হওয়ার পরে এটি পরিবর্তন করা কখনই ভাল ধারণা নয়। খারাপ জিনিস হবে। বিমূর্ততা ফুটো হবে। শয়তানরা আমাদের মাত্রা ভেঙ্গে ধ্বংসস্তূপ ডেকে আনবে। তাই হ্যাঁ, .ToList()এখানে সহায়তা করে;)
ডারেন টমাস

5

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


1

অনেকগুলি কেস রয়েছে (যেমন একটি অসীম তালিকা বা খুব বড় তালিকা) যেখানে IEnumerable একটি তালিকায় রূপান্তরিত হতে পারে না। সর্বাধিক সুস্পষ্ট উদাহরণগুলি হ'ল সমস্ত মৌলিক সংখ্যা, ফেসবুকের সমস্ত ব্যবহারকারী তাদের বিবরণ সহ, বা ইবেতে থাকা সমস্ত আইটেম।

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

[সম্পাদনা] - বলা বাহুল্য - এটি "এটি হয় বা এটি" হয় না। প্রায়শই এটি একই ক্লাসে একটি তালিকা এবং একটি IEnumerable উভয় ব্যবহার করা ভাল বুদ্ধিমান হবে। বিশ্বের কোনও কম্পিউটার সমস্ত মৌলিক সংখ্যা তালিকাভুক্ত করতে পারে না, কারণ সংজ্ঞা অনুসারে এর জন্য অসীম পরিমাণের মেমরির প্রয়োজন হবে। তবে আপনি সহজেই class PrimeContainerএমন একটি সম্পর্কে ভাবতে পারেন যা একটি ধারণ করে IEnumerable<long> primes, যা স্পষ্ট কারণেও একটি রয়েছে SortedList<long> _primes। এখন পর্যন্ত গণনা করা সমস্ত প্রাইমস। পরবর্তী পরীক্ষা করা হবে কেবল বিদ্যমান প্রাইমগুলির বিরুদ্ধে চালানো হবে (বর্গমূল পর্যন্ত)। এইভাবে আপনি উভয়ই অর্জন করতে পারেন - একসাথে প্রাইমগুলি এক (আইনিউমারেবল) এবং "এখন পর্যন্ত" প্রাইমগুলির একটি ভাল তালিকা, যা পুরো (অসীম) তালিকার একটি খুব ভাল আনুমানিকতা।

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