অ্যারেলিস্ট বনাম তালিকা <> সি # তে


412

সি # তে ArrayListএবং পার্থক্য কী List<>?

এটি কি কেবল List<>টাইপ ArrayListকরে না যখন থাকে না?



5
এটি একটি নিকটে প্রশ্ন, তবে আমি মনে করি ঠিক এটি সদৃশ নয়। এটি List<>সাধারণভাবে সম্পর্কে জিজ্ঞাসা করে , যখন যে কেউ List<object>বিশেষভাবে জিজ্ঞাসা করে
গুডেয়ে

এটি খুব সহায়ক ব্লগ খুঁজে পেয়েছে, এটি সাহায্য করতে পারে। : ভেবেছিলাম লিংক ভাগ করা উচিত fintechexplained.blogspot.co.uk/2017/07/...
InfoLearner

উত্তর:


533

হ্যাঁ, বেশ। List<T>একটি জেনেরিক ক্লাস। এটি কোনও নির্দিষ্ট ধরণের মান to objectালাই বা না withoutালাই সংরক্ষণ করে (যা ক্ষেত্রে Tমূল্যমানের ধরণের ArrayListক্ষেত্রে বক্সিং / আনবক্সিং ওভারহেডে পড়তে পারে) সমর্থন করে। ArrayListকেবল objectরেফারেন্স সঞ্চয় করে । জেনেরিক সংগ্রহ হিসাবে, List<T>জেনেরিক IEnumerable<T>ইন্টারফেস প্রয়োগ করে এবং লিনকুইতে সহজেই ব্যবহার করা যেতে পারে (কোনও Castবা OfTypeকল প্রয়োজন ছাড়াই )।

ArrayListসি # এর জেনেরিকস নেই এমন দিনগুলির সাথে সম্পর্কিত। এটি পক্ষে হ্রাস করা হয়েছে List<T>ArrayListNET> = 2.0 কে টার্গেট করে এমন নতুন কোডে আপনার ব্যবহার করা উচিত নয় যদি না আপনি এটি ব্যবহার করে এমন কোনও পুরানো API এর সাথে ইন্টারফেস না করে।


আপনি কেন "বক্সিং" ব্যবহার করেছেন এবং "ingালাই" করছেন না তা বোঝাতে কি আপত্তি হবে? এখানে বক্সিং কি হয়? অবজেক্টগুলি বরাদ্দ / অবনতি হয়?
বেনিয়ামিন গ্রুইনবাউম

2
আপনি কী ঠিক করেছেন যে কাস্টিং আরও সাধারণ হবে @ এটি বলেছিল, রানটাইমের আসল পার্থক্য হ'ল আপনি যখন মান ধরণের (যখন আমি "বক্সিং" লেখার সময় ধরেছিলাম) with রেফারেন্স ধরণের জন্য, আচরণটি ArrayListরানটাইমের সময় কার্যকরভাবে একই । স্ট্যাটিক্যালি যদিও, এটির সাথে একটি কাস্ট লাগবে ArrayList
মেহরদাদ আফশারি

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


@ Ant_222, সেই ব্লগটি প্রায় 15 বছর আগে লেখা হয়েছিল। আমি মনে করি গত দশক ধরে প্রমাণগুলি প্রমাণ করেছে যে জেনেরিকগুলি ক্ষতিকারক নয়। :)
স্কট অ্যাডামস

101

List<T>আপনি ব্যবহার করে ingালাই ত্রুটি প্রতিরোধ করতে পারে। রানটাইম cast ালাইয়ের ত্রুটি এড়াতে এটি খুব দরকারী ।

উদাহরণ:

এখানে (ব্যবহার করে ArrayList) আপনি এই কোডটি সংকলন করতে পারেন তবে পরে আপনি কার্যকর করার ত্রুটি দেখতে পাবেন।

ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony"); //No error at compile process
int total = 0;
foreach (int num in array1)
{
 total += num; //-->Runtime Error
}

আপনি যদি ব্যবহার করেন তবে আপনি Listএই ত্রুটিগুলি এড়িয়ে চলুন:

List<int> list1 = new List<int>();
list1.Add(1);
//list1.Add("Pony"); //<-- Error at compile process
int total = 0;
foreach (int num in list1 )
{
 total += num;
}

তথ্যসূত্র: এমএসডিএন


কাস্টিং ত্রুটিগুলি রোধ করতে আপনি অ্যারেলিস্ট থেকে টানলে আপনি প্রকারটি পরীক্ষা করতে পারেন। আজকাল লোকেরা অবজেক্ট ব্যবহার করে, অ্যারেলিস্ট তৈরি করে আর প্রয়োজন হয় না।
স্যুইচ করুন

1
আমি ন্যায্যতার কাছে +1 করি তবে ত্রুটিগুলি এড়াতে আপনার অ্যারে তালিকায় (সংখ্যাটি আন্তঃসংযোগ)} if আপনি এখনও করতে পারেন
মিনা গ্যাব্রিয়েল

Ingালাই ত্রুটি এবং বক্সিং ওভারহেড প্রতিরোধ করুন। সাধারণভাবে জেনারিকের জন্য অনেক কারণ।

26

উপরোক্ত বিষয়গুলিতে যুক্ত করতে। ব্যবহার ArrayList64bit অপারেটিং সিস্টেমের মধ্যে 32bit অপারেটিং সিস্টেম ব্যবহার তুলনায় 2x মেমরির লাগে। এদিকে, জেনেরিক তালিকাটি এর List<T>চেয়ে অনেক কম মেমোরি ব্যবহার করবে ArrayList

উদাহরণস্বরূপ, যদি আমরা ArrayList32-বিটের মধ্যে 19MB ব্যবহার করি তবে এটি 64-বিটে 39MB লাগবে। তবে যদি আপনার কাছে List<int>32-বিটের 8 এমবি এর জেনেরিক তালিকা থাকে তবে এটি কেবলমাত্র 8.1 এমবি লাগবে -৪-বিটে, যা অ্যারেলিস্টের সাথে তুলনা করার সময় একটি তীব্র 481% পার্থক্য।

উত্স: অ্যারেলিস্টের বনাম আদিম ধরণের এবং 64৪-বিটের জন্য জেনেরিক তালিকা


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

19

যুক্ত করার জন্য আরেকটি পার্থক্য হ'ল থ্রেড সিঙ্ক্রোনাইজেশন সম্পর্কিত।

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

List<T>কোনও থ্রেড সিঙ্ক্রোনাইজেশন সরবরাহ করে না; আইটেমগুলি একযোগে একাধিক থ্রেডে যুক্ত করা বা অপসারণ করার সময় ব্যবহারকারী কোডকে সমস্ত সিঙ্ক্রোনাইজেশন সরবরাহ করতে হবে।

এখানে আরও তথ্য । নেট ফ্রেমওয়ার্কে থ্রেড সিঙ্ক্রোনাইজেশন


আমি বলছি না ArrayListযদি এটি এড়ানো যায় তবে আপনার ব্যবহার করা উচিত, তবে এটি একটি নির্বোধ কারণ। মোড়ক পুরোপুরি পুরোপুরি alচ্ছিক; আপনার যদি লকিংয়ের প্রয়োজন না হয় বা আপনার আরও দানাদার নিয়ন্ত্রণের প্রয়োজন হয় তবে মোড়কটি ব্যবহার করবেন না।
থোররিন

1
আপনি যদি থ্রেড-সুরক্ষা চান তবে আমি অ্যারেলিস্ট বিবেচনা করার আগে সিস্টেম.কলেকশনস.কন্টেরেন্ট নেমস্পেসের দিকে তাকানোর পরামর্শ দিই।
ইয়োকোক

15

সহজ উত্তরটি হ'ল,

অ্যারেলিস্টটি নন-জেনেরিক

  • এটি একটি অবজেক্ট টাইপ, যাতে আপনি এটিতে যে কোনও ডেটা টাইপ সঞ্চয় করতে পারেন।
  • আপনি অ্যারেলিস্টে কোনও মান (মানের ধরণ বা রেফারেন্সের ধরণ) যেমন স্ট্রিং, ইনট, কর্মচারী এবং অবজেক্ট সংরক্ষণ করতে পারেন। (দ্রষ্টব্য এবং)
  • বক্সিং এবং আনবক্সিং ঘটবে।
  • নিরাপদ টাইপ না।
  • এটি পুরানো।

তালিকাটি জেনেরিক

  • এটি টাইপের ধরণ, তাই আপনি রান-টাইমে টি নির্দিষ্ট করতে পারেন।
  • আপনি ঘোষণার ভিত্তিতে টাইপ টি (স্ট্রিং বা ইন্ট বা কর্মচারী বা অবজেক্ট) এর একমাত্র মান সঞ্চয় করতে পারেন। (নোট বা)
  • বক্সিং এবং আনবক্সিং হবে না।
  • নিরাপদ টাইপ করুন।
  • এটা আরও নতুন।

উদাহরণ:

ArrayList arrayList = new ArrayList();
List<int> list = new List<int>();

arrayList.Add(1);
arrayList.Add("String");
arrayList.Add(new object());


list.Add(1);
list.Add("String");                 // Compile-time Error
list.Add(new object());             // Compile-time Error

মাইক্রোসফ্ট অফিসিয়াল ডকুমেন্টটি পড়ুন : https : //blogs.msdn.mic Microsoft.com/kcwalina/2005/09/23/system-colલેક્--vs-system-colલેક્- জেনেরিক- এবং- সিস্টেমে-colifications- objectmodel/

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

দ্রষ্টব্য : পার্থক্যটি বোঝার আগে আপনার জেনেরিক্সগুলি জানা উচিত: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/


4

ArrayListএটি হ'ল বিভিন্ন ধরণের ডেটা List<>সংগ্রহ যেখানে একই ধরণের নিজস্ব নিজস্ব অবক্ষয়ের সংগ্রহ is



2

পারফরম্যান্স ইতিমধ্যে একটি পৃথক কারণ হিসাবে বিভিন্ন উত্তরে উল্লেখ করা হয়েছে, কিন্তু " কত ধীর গতি ArrayList? "এবং" কেন এটি সামগ্রিকভাবে ধীর? ”, নীচে দেখুন।

যখনই মানের ধরণের উপাদান হিসাবে ব্যবহৃত হয়, তখন পারফরম্যান্স নাটকীয়ভাবে হ্রাস পায় ArrayList। কেবল উপাদান যুক্ত করার ক্ষেত্রে বিবেচনা করুন। বক্সিং চলার কারণে - যেহেতু ArrayListকেবল যোগগুলি objectপ্যারামিটার নেয় - আবর্জনা সংগ্রাহক এর চেয়ে অনেক বেশি কাজ সম্পাদনে তত্পর হয় List<T>

সময়ের পার্থক্য কত? কমপক্ষে কয়েকগুণ কম ধীর List<T>। শুধু কি কোড একটি 10 মিল int- এ মান যোগ সঙ্গে ঘটে কটাক্ষপাত করা ArrayListবনাম List<T>: এখানে চিত্র বর্ণনা লিখুন

এটি হলুদে হাইলাইট করা 'মিন' কলামে 5x এর একটি রান টাইম পার্থক্য । প্রতিটি বর্ণের জন্য আবর্জনা সংগ্রহের সংখ্যার পার্থক্যটিও লক্ষ করুন, লাল রঙে হাইলাইট করা হয়েছে (জিসি / 1000 রানের সংখ্যা নেই)।

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

আমি উপরের ArrayListদৃশ্যের সাথে কী ঘটে যায় তার একটি বিশদ বিশ্লেষণ লিখেছি https://mihai-albert.com/2019/12/15/boxing-performance-in-c-analysis-and-benchmark/

অনুরূপ অনুসন্ধানগুলি জেফ্রি রিখর দ্বারা "সিএলআর মাধ্যমে সি #" তে রয়েছে। অধ্যায় 12 (জেনারিক্স) থেকে:

[…] যখন আমি আমার কম্পিউটারে এই প্রোগ্রামটির একটি রিলিজ বিল্ড (অপ্টিমাইজেশন চালু করা হয়) সংকলন করি এবং চালিত করি তখন আমি নিম্নলিখিত আউটপুটটি পাই।

00: 00: 01.6246959 (GCs = 6) তালিকা <আইটি 32>
00: 00: 10.8555008 (জিসি = 390) এরেন্টি তালিকা
00: 00: 02.5427847 (সিসি = 4) তালিকা <স্ট্রিং>
00: 00: 02.794444831 (জিসিএস = 7 ) অ্যারেলিস্ট অফ স্ট্রিং

এখানে আউটপুট দেখায় যে Int32 টাইপের সাথে জেনেরিক তালিকার অ্যালগরিদম ব্যবহার করা আন্তঃ 32 এর সাথে জেনেরিক অ্যারেলিস্ট অ্যালগরিদম ব্যবহারের চেয়ে অনেক দ্রুত। আসলে, পার্থক্যটি অসাধারণ: প্রায় 11 সেকেন্ডের তুলনায় 1.6 সেকেন্ড। এটি times 7 গুণ দ্রুত ! এছাড়াও, অ্যারেলিস্ট সহ একটি মান ধরণের (ইন্ট 32) ব্যবহার করার ফলে প্রচুর বক্সিং অপারেশন ঘটে যার ফলস্বরূপ 390 আবর্জনা সংগ্রহের ফলাফল। এদিকে তালিকার অ্যালগরিদমে 6 টি আবর্জনা সংগ্রহের প্রয়োজন।


1

আমি মনে করি, মধ্যে পার্থক্য ArrayListএবং List<T>আছেন:

  1. List<T>, যেখানে টি মান-প্রকারের চেয়ে দ্রুত ArrayList। এটি কারণ List<T>বক্সিং / আনবক্সিং এড়ানো (যেখানে টি মান ধরণের)।
  2. অনেক উত্স বলছেন - সাধারণত ArrayListপিছিয়ে সামঞ্জস্যের জন্য ব্যবহৃত হয়। (বাস্তব পার্থক্য নয়, তবে আমি মনে করি এটি গুরুত্বপূর্ণ নোট)।
  3. ননজেনারিকের সাথে ArrayListতখন প্রতিফলন আরও সহজList<T>
  4. ArrayListহয়েছে IsSynchronizedসম্পত্তি। সুতরাং, সিঙ্ক্রোনাইজড তৈরি এবং ব্যবহার করা সহজ ArrayList। আমি এর IsSynchronizedজন্য সম্পত্তি পাইনি List<T>। এছাড়াও মনে রাখবেন এই ধরণের সিঙ্ক্রোনাইজেশন তুলনামূলকভাবে অদক্ষ, এমএসডিএন ):

    var arraylist = new ArrayList();
    var arrayListSyncronized = ArrayList.Synchronized(arraylist
    Console.WriteLine($"syncronized {arraylist.IsSynchronized}");
    Console.WriteLine($"syncronized {arrayListSyncronized.IsSynchronized}");
    
    var list = new List<object>();
    var listSyncronized = ArrayList.Synchronized(list);
    Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
    Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
  5. ArrayListসিঙ্ক্রোনাইজেশনArrayList.SyncRoot ( এমএসডিএন ) এর জন্য ব্যবহারযোগ্য সম্পত্তি রয়েছে property List<T>না আছে SyncRootসম্পত্তি, তাই নিম্নলিখিত নির্মাণে আপনি কিছু অবজেক্ট ব্যবহার করে আপনি ব্যবহার দরকার List<T>:

    ArrayList myCollection = new ArrayList();
    lock(myCollection.SyncRoot) //  ofcourse you can use another object for this goal
    {
        foreach (object item in myCollection)
        {
            // ...
        }
    }

0

.NET ফ্রেমওয়ার্ক ডকুমেন্টেশনে উল্লিখিত হিসাবে

আমরা আপনাকে ArrayListনতুন বিকাশের জন্য ক্লাসটি ব্যবহার করার পরামর্শ দিচ্ছি না । পরিবর্তে, আমরা আপনাকে জেনেরিক List<T> ক্লাস ব্যবহার করার পরামর্শ দিই । ArrayListবর্গ অবজেক্টের ভিন্নধর্মী সংগ্রহের রাখা ডিজাইন করা হয়েছে। তবে এটি সর্বদা সেরা পারফরম্যান্স দেয় না। পরিবর্তে, আমরা নিম্নলিখিতটি সুপারিশ করি:

  • বস্তুর বিজাতীয় সংগ্রহের জন্য, List<Object>(সি # তে) বা List(Of Object)(ভিজ্যুয়াল বেসিক) প্রকারটি ব্যবহার করুন।
  • সামগ্রীর একজাতীয় সংগ্রহের জন্য, List<T>শ্রেণিটি ব্যবহার করুন ।

আরও দেখুন জেনারিক সংগ্রহগুলি ব্যবহার করা উচিত নয়

সারণীটি দেখায় যে কীভাবে জেনারিক সংগ্রহের ধরণগুলি তাদের জেনেরিক অংশগুলি প্রতিস্থাপন করতে পারে


-2

"তালিকা" ব্যবহার করে আপনি কাস্টিং ত্রুটিগুলি প্রতিরোধ করতে পারেন। রানটাইম castালাইয়ের ত্রুটি এড়াতে এটি খুব দরকারী।

উদাহরণ:

এখানে (অ্যারেলিস্ট ব্যবহার করে) আপনি এই কোডটি সংকলন করতে পারেন তবে পরে আপনি কার্যকর করার ত্রুটি দেখতে পাবেন।

    // Create a new ArrayList


    System.Collections.ArrayList mixedList = new System.Collections.ArrayList();


    // Add some numbers to the list
    mixedList.Add(7);
    mixedList.Add(21);


    // Add some strings to the list
    mixedList.Add("Hello");
    mixedList.Add("This is going to be a problem");




    System.Collections.ArrayList intList = new System.Collections.ArrayList();
    System.Collections.ArrayList strList = new System.Collections.ArrayList();


    foreach (object obj in mixedList)
    {
        if (obj.GetType().Equals(typeof(int)))
        {
            intList.Add(obj);
        }
        else if (obj.GetType().Equals(typeof(string)))
        {
            strList.Add(obj);
        }
        else
        {
            // error.
        }
    }

এটি তিন বছর আগে উত্তর টার্মগুলি যে উত্তর দিয়েছিল তা ছাড়িয়ে কী যুক্ত করবে? এটি উত্সের সাথে লিঙ্ক না করে, বিন্যাসে সঠিকভাবে বিন্যাস না করে প্রায় একই পাঠ্য পদক্ষেপ রয়েছে
ডগলাস জারে

-3

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

টম জনসন (একটি প্রবেশ ... এক প্রস্থান)

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