আইনিমেবল এবং অ্যারে, আইলিস্ট এবং তালিকার মধ্যে পার্থক্য কী?


92

মধ্যে পার্থক্য কি IEnumerableএবং Array?

মধ্যে পার্থক্য কি IListএবং List?

এগুলির একই ফাংশন রয়েছে বলে মনে হয়।

উত্তর:


101

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

অ্যারেটি এলোমেলো অ্যাক্সেস সহ একটি স্থির আকারের সংগ্রহ (যেমন আপনি এটিতে সূচক করতে পারেন) can

তালিকাটি এলোমেলো অ্যাক্সেসের সাথে একটি পরিবর্তনশীল-আকারের সংগ্রহ (যেমন আপনি উপাদানগুলি যুক্ত করতে এবং মুছতে পারেন)।

আইলিস্ট হ'ল একটি ইন্টারফেস যা তালিকার কার্যকারিতা (গণনা, যোগ, অপসারণ, সূচক অ্যাক্সেস) কে বিভিন্ন কংক্রিট ক্লাস যেমন তালিকা, বাইন্ডিংলিস্ট, পর্যবেক্ষণযোগ্য সংগ্রহ ইত্যাদি থেকে দূরে রাখে ab


4
গৃহীত উত্তর অনুসারে এখানে stackoverflow.com/questions/1826658/… । আইনিউমারেবলের উপর গণনা প্রায় একই বিচিউস এটি আইকোলিকেশনকে গণ্য করতে কল করতে চেষ্টা করে
— কার্স্টেন

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

17

আইনিউমারেবল হ'ল একটি ইন্টারফেস যা আইটেমের সংগ্রহের মাধ্যমে পুনরাবৃত্তির অনুমতি দেয় (উদাহরণস্বরূপ ফরচ কিওয়ার্ডের মাধ্যমে)।

একটি অ্যারে একটি। নেট অন্তর্নিহিত। এটি একই ধরণের আইটেম ধারণ করে তবে এটি একটি নির্দিষ্ট আকারের। একবার আপনি এক্স উপাদানগুলির সাহায্যে একটি অ্যারে তৈরি করলে, এটি বৃদ্ধি বা সঙ্কুচিত হতে পারে না।

আইলিস্ট একটি তালিকার জন্য ইন্টারফেসটি সংজ্ঞায়িত করে, এবং আইইনুমেবল কার্যকর করে।

তালিকাটি আইলিস্ট ইন্টারফেস প্রয়োগ করে; এটি তালিকার একটি কংক্রিট ধরণের।

.NET তালিকা এবং অ্যারেগুলির মধ্যে পার্থক্য হ'ল তালিকাগুলিতে তাদের সাথে উপাদান যুক্ত থাকতে পারে - তারা প্রয়োজনীয় সমস্ত আইটেম ধরে রাখতে যথেষ্ট বড় হতে পারে। তালিকাটি এটিকে অভ্যন্তরীণভাবে একটি অ্যারেতে সংরক্ষণ করে এবং, অ্যারে যখন সমস্ত উপাদানকে ধরে রাখতে যথেষ্ট বড় হয় না, তখন একটি নতুন অ্যারে তৈরি হয় এবং আইটেমগুলি অনুলিপি করা হয়।

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


4
পাঠকদের জন্য এই মন্তব্য যুক্ত করা যা সমস্ত উত্তর পড়েন না: অ্যারে এবং তালিকা <> উভয়ই আইলিস্ট <> প্রয়োগ করে (অ্যারে এটির অনেকাংশ স্পষ্টভাবে প্রয়োগ করে, সম্ভবত সদস্যদের মধ্যে একটি নটসপোর্টড এক্সসেপশন নিক্ষেপ করে বলে)। আইলিস্ট এটি প্রয়োগ করে বলার অপেক্ষা রাখে না বলে আইএনমিওরেবলের উত্তরাধিকার সূত্রে বলা আরও সঠিক।
— ফুগ

9

আইনিউমেবল এবং আইলিস্ট হ'ল ইন্টারফেস । অ্যারে এবং তালিকা ক্লাস হয়। অ্যারে আইনিউমারেবল প্রয়োগ করে। তালিকাটি আইলিস্ট প্রয়োগ করে যা আইনেউমারেবল প্রসারিত করে।

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


আমিও না! আপনি যদি অ্যালিস্টে IList.RemoveAt কল করা শুরু করেন তবে কি হবে?
— সিম্পসন 3

এটি একটি নটসোপোর্টড এক্সসেপশন ছুড়ে দেয়। (দ্রষ্টব্য IList.RemoveAt এবং অনুরূপ IList পদ্ধতিগুলি স্পষ্টভাবে অ্যারেতে প্রয়োগ করা হয়েছে যাতে তারা কোনও সাধারণ অ্যারে রেফারেন্সটি না দেখায়!)
— itowlson

4
@ আইটলসন আমি উল্লেখ করব যে কেবল সিস্টেম.আর্রে (প্রতি শ্রেণিতে) আইলিস্ট কার্যকর করে, তবে টি [] আইলিস্ট <টি> প্রয়োগ করে না। টি [] পরিবর্তে আইনিম্যুয়াল <T> প্রয়োগ করে। আমি মনে করি ওপি প্রয়োজনীয়ভাবে সিস্টেমের জন্য জিজ্ঞাসা করেনি। "অ্যারে" আইএমএইচও জিজ্ঞাসা করার সময় অ্যারে
— usr-local-local

6

একটি IEnumerable সংগ্রহ জেনারেশন অলস। উদাহরণ:

public IEnumerable<int> GetTwoInts()
{
  yield return 1;
  yield return 2;
}
public void Something()
{
  var twoInts = GetTwoInts();
}

পদ্ধতিতে কিছু উপায়ে getTwoInts () এ কল করার ফলে প্রকৃতপক্ষে পদ্ধতিটি GetTwoInts কার্যকর করা হবে না কারণ গণনাটি কখনই পুনরাবৃত্তি হয় না।


আপনি কি দয়া করে এটি কিছুটা ব্যাখ্যা করতে পারেন? আমি এটি সঠিকভাবে বুঝতে পেরেছি কিনা তা নিশ্চিত নই। আপনি পরে কোডের একটি লাইন প্রদর্শন করতে পারেন যার ফলে সেই পদ্ধতিটি কার্যকর হবে? ধন্যবাদ!
— পাওন

@ পাওন twoIntsএকটি foreachবা কল করুন twoInts.ToList()।
— সারি 1

2

IEnumerableএকটি সাধারণ-উদ্দেশ্য ইন্টারফেস যা অনেক শ্রেণি দ্বারা ব্যবহৃত হয়, যেমন Array, Listএবং Stringকোনও সংগ্রহকে পুনরাবৃত্তি করতে দেয় let মূলত, এটি যা চালায়foreach বিবৃতি ।

IListসাধারণত আপনি কীভাবে Listশেষ ব্যবহারকারীদের কাছে বিভিন্ন ধরণের ভেরিয়েবল প্রকাশ করেন । এই ইন্টারফেসটি অন্তর্নিহিত সংগ্রহটিতে এলোমেলো অ্যাক্সেসের অনুমতি দেয়।


2

অন্যান্য উত্তরগুলির পরিপূরক হিসাবে, নোট করুন যে কোনও ফরচ স্টেটমেন্ট কার্যকর করার সময় এবং এর মধ্যে পারফরম্যান্সের পার্থক্য রয়েছে ।IList<T>List<T>

এর কারণ যে আয়রেটর বস্তুটি ফেরত পাঠানো হয় List<T>.GetEnumeratorএটি একটি মান-প্রকার এবং সেখানে ফিরে আসাটি IList<T>.GetEnumeratorএকটি রেফারেন্স-টাইপ এবং সুতরাং একটি মেমরি বরাদ্দ প্রয়োজন ( সি # তে মান ধরণের তালিকার পরিসংখ্যান দেখুন )।

আমার মতে, IList<T> যাইহোক একটি খুব ভাল ইন্টারফেস না। উদাহরণস্বরূপ কলিং Addনিক্ষেপ করতে পারে ( অ্যারে কেন আইলিস্ট প্রয়োগ করে? দেখুন )। আপনার যদি এনক্যাপসুলেশন প্রয়োজন হয় তবে আপনি ব্যবহার IEnumerable<T>বা ব্যবহারের চেয়ে ভাল IReadOnlyList<T>।


1

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

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

অন্য প্রসঙ্গে, লিনকিউ এক্সপ্রেশন প্রত্যাবর্তনযোগ্য গণনা কার্যকর না হওয়া পর্যন্ত কার্যকর করা স্থগিত করবে .ToList()। নীচে উদাহরণ বিবেচনা করুন:

void Main()
{
    var w1 = "AB".AsEnumerable();
    Console.WriteLine($"W1: 1");
    w1 = w1.Where(W1);
    Console.WriteLine($"W1: 2");
    w1 = w1.Where(W2);
    Console.WriteLine($"W1: 3");
    w1.ToList();    
    Console.WriteLine($"----------");

    var w2 = "CD".AsEnumerable();
    Console.WriteLine($"W2: 1");
    w2 = w2.Where(W1);
    Console.WriteLine($"W2: 2");
    w2 = w2.ToList();
    Console.WriteLine($"W2: 3");
    w2 = w2.Where(W2);
    Console.WriteLine($"W2: 4");
    w2.ToList();    
    Console.WriteLine($"----------");
}

bool W1(char arg)
{
    Console.WriteLine($"W1:{arg}");
    return true;
}

bool W2(char arg)
{
    Console.WriteLine($"W2:{arg}");
    return true;
}

OUTPUT:
W1: 1
W1: 2
W1: 3
W1:A
W2:A
W1:B
W2:B
----------
W2: 1
W2: 2
W1:C
W1:D
W2: 3
W2: 4
W2:C
W2:D
----------

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

যদিও আমরা লেখার কোডে এই ভাবে কলিং প্রবণতা না .ToList()LINQ কল করার মাঝে কিন্তু এটি আরো ঘন ঘটতে পারে যখন পুনর্ব্যবহারযোগ্য পদ্ধতি ফিরে আসতে মধ্যে আমরা ফ্যাক্টর কোড List/Arrayবদলে IEnumerable।

এর অর্থ এই নয় যে আমাদের সর্বদা চালিত হওয়া উচিত IEnumerable। টলসনের দ্বারা উল্লিখিত হিসাবে , যে ক্রিয়াকলাপগুলি .Count()সংগ্রহের উপরে পুনরাবৃত্তি ঘটায় যখন একটি তালিকা বা অ্যারে এই তথ্যটি প্রাক-গণনা করে এবং তাই List/Arrayআপনি .Count()একাধিকবার কল করার পরিকল্পনা করেন তবে রূপান্তরকরণ আরও কার্যকর হবে । এই কারণেই .Countতালিকার একটি সম্পত্তি সম্পত্তি হিসাবে এটি .Count()গণনা করার চেয়ে আছে ।


0

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

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