سؤال

وأنا غالبا ما تستخدم ArrayList بدلا من array[] «طبيعية».

وأشعر كما لو أنني الغش (أو كسولا) عندما تستخدم ArrayList، عندما هو بخير لاستخدام ArrayList على مجموعة؟

هل كانت مفيدة؟

المحلول

يتم كتابتها

وصالحة بقوة، وتعمل كذلك المعلمات. إذا كنت تعرف طول مجموعتك وثابتة، يجب عليك استخدام صفيف.

لا يتم كتابتها ArrayLists بقوة، فإن كل الإدراج أو إعادة المحاكمة تحتاج يلقي على العودة إلى نوع الأصلي. إذا كنت بحاجة إلى وسيلة لاتخاذ لائحة من نوع معين، ArrayLists تقصر لأنك يمكن أن تمر في ArrayList تحتوي على أي نوع. ArrayLists نستخدم مجموعة من توسيع حيوي داخليا، لذلك هناك أيضا ضربة لتوسيع حجم المصفوفة الداخلية عندما يضرب طاقتها.

وماذا كنت تريد حقا أن استخدام لائحة عامة مثل List<T>. هذا لديه كل مزايا صفيف وArrayLists. يتم كتابتها بشدة وتدعم طول متغير من البنود.

نصائح أخرى

وبالإضافة إلى بوب والاستجابة فريدريك، أود أن أشير إلى أنه في حين صفائف لها التغاير، والقوائم العامة لا. على سبيل المثال، مجموعة من نوع MyChildClass[] يمكن محمل بسهولة إلى MyParentClass[]، في حين List<MyChildClass> لا يمكن مسبوكة لList<MyParentClass>، على الأقل ليس بشكل مباشر.

إذا كنت تحتاج التغاير، إما صفائف استخدام، استخدم المصبوب LINQ () لطريقة أو وسيلة أخرى ليلقي كل بند على حدة <س> أو الانتظار لC # 4 .

واحد فكر الآخر هنا هو طفرة. مجموعة (T[]) هي قابلة للتغيير بشكل كامل، ولا يمكن باي. List<T> لا تقدم أي نقاط تمديد مفيدة، ولكن أشياء مثل Collection<T> (أو العديد من تطبيقات IList<T> أخرى) يسمح لك لإضافة رمز، على سبيل المثال، للتأكد من البنود قبل إضافتها. وبالمثل، يمكن أن يكون لديك تطبيقات IList<T> للقراءة فقط، وهو أمر مفيد للسلامة ترابط حيث ثبات أمر مرغوب فيه.

وأنا أميل إلى استخدام المصفوفات إما في المنطق طريقة الداخلي (ربما كمتغير المحلي)، كوسائط params، أو في حالات قليلة الأمثل للغاية حيث أنا أعلم أن طول هذه البنود، وأنا أعلم رمز <م> يختار لا يتحور عليه (كحقل الخاص). بخلاف ذلك، List<T> الخ تميل إلى أن تكون أكثر شيوعا، كما لديهم أقل بكثير النفقات العامة عند إضافة / إزالة العناصر.

وإذا لم ذلك الجزء من القانون على الاطلاق الأداء النقدي، وذلك باستخدام ArrayList على ما يرام تماما.

والأفضل من ذلك، أينما كنت تستخدم ArrayList، استخدم List<T> جمع عام بدلا من ذلك. يتم كتابتها أكثر بشدة من السابق.

وأنا الإجابة عن هذا من وجهة نظر جافا، لكنه في نفس القضية الأساسية. يجب أن لا تشعر بالذنب استخدام المجردات أعلى. بعد كل شيء، كنت تستخدم Strings بدلا من char[]، أو حتى byte[]؟ أنا أقترح حتى يخطو خطوة إضافية واستخدام واجهة List حيثما كان ذلك ممكنا. السبب الوحيد للذهاب خطوة واحدة إلى أسفل هو لأسباب تتعلق بالأداء.

وعن طريق التجريد جمع أكبر العديد من المزايا. يمكنك إضافة الديكور لجعل قائمة للقراءة فقط، وجعلها ثابتة الحجم، تحقق من العناصر التي تدخل أو تغادر جمع أو استخدام طرق (انظر GetRange في C # و subList في جاوة).

وبالمناسبة، يجب أن يرتكز دائما على ArrayList على مجموعة بدائية، وإلا فإن اسم خاطئ. يتم تنفيذ العمليات عادة فقط كيف تتوقعون عند استخدام مجموعة بدائية. إذا تم استخدام قائمة مرتبطة انها عادة اسمه فقط - LinkedList. وهذا أيضا الاستفادة من استخدام واجهة: يمكنك تغيير رأيك حول تنفيذ استخدامها في وقت لاحق

وهناك عدد قليل من الأشياء التي تجعل استخدام مجموعات عالي الكعب. التحذير واحدة هو أن مجموعات وعادة ما تكون على أساس الأشياء، واللغات وجود فجوة كبيرة بين أنواع بدائية وجوه. والأدوية محدودة لا تساعد كثيرا سواء. ومع ذلك، فإنني أوصي المجموعات على المصفوفات ما لم يكن هناك سبب وجيه غير ذلك.

لالقيم البدائية قد تفكر أيضا باستخدام مكتبة جمع بدائية، على سبيل المثال GNU الدفين . لا أعرف إذا كان هناك أي شيء مماثل لC #، وإن كان.

رائع مغامرات في الترميز وقد كتب على قطعة <لأ href = "HTTP: //blogs.msdn.com/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx "يختلط =" noreferrer نوفولو "> صفائف تعتبر ضارة إلى حد ما . انها قراءة مثيرة للاهتمام حقا.

وحسنا لأحد، وإذا كنت تنوي فقط للتعامل مع نوع معين، يجب أن لا تستخدم ArrayList. على سبيل المثال، إذا كنت تتوقع فقط مجموعة من وحدات البايت، يجب أن تقبل سوى مجموعة من بايت.

وفقط مرة كنت تعتقد أنك قد تفكر في استخدام ArrayList هو بدلا من قائمة.

وحجم المصفوفة هو ثابت، لذلك إذا كنت لا تعرف حجم في وقت التصميم، واستخدام مجموعة. ومن المفترض أن تعمل بشكل أسرع، ولكنني لم نجرب ذلك بنفسي. إذا كنت بحاجة إلى تغيير عدد من الأشياء في كثير من الأحيان (إضافة أو إزالة الكائنات من المجموعة) استخدام ArrayList أو أفضل من قائمة عامة من صافي 2. كما أنه من الأسهل للاستخدام، حتى إذا كان الأداء ليس حاسما، يمكنك دائما استخدام قائمة.

إذا كنت بحاجة إلى مجموعة من أنواع البدائية استخدام صفيف من أجل أداء أفضل لأنها سوف تجنب autoboxing وعلبته. ولكن فقط إذا كنت تعرف الحجم الذي تريده في وقت مبكر.

وانها مثل هذا.

using System;
using System.Collections;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //ArrayList
            /*
             An ArrayList doesn't use a LinkedList as the internal data structure! .we can store any type of objects      
             */
            ArrayList list = new ArrayList();
            list.Add("1"); // not strongly type,you can enter any object types (int,string decimals, etc..)
            list.Add(1);
            list.Add(1.25);

            //Array
            /*
             must declare length.
             */
            string[] array = new string[3]; // you must declare object types
            array[0] = "1";
            //array[1] = 1; this get error becoz array is storngly typed. // this print empty value when you run it
            array[2] = "stongly typed";
            Console.WriteLine("------- ARRAYLIST ITEMS ---------");
            foreach (var i in list) {
                Console.WriteLine(i);
            }

            Console.WriteLine("--------- ARRAY ITEMS -----------");
            foreach (var i in array)
            {
                Console.WriteLine(i);
            }

            Console.ReadKey(); 
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top