Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

ArrayList vs. Collection

Îåêßíçóå áðü ôï ìÝëïò JohnL. Τελευταία δημοσίευση από το μέλος Mitsaras στις 11-11-2007, 05:51. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-11-2007, 14:00 37150

    ArrayList vs. Collection

    Έχω τον ακόλουθο κώδικα (παράδειγμα):

    Public Class Book
        Private _index As Integer
        Private _title As String

        Public Property index() As Integer
            Get
                Return _index
            End Get
            Set(ByVal value As Integer)
                _index = value
            End Set
        End Property

        Public Property Title() As String
            Get
                Return _title
            End Get
            Set(ByVal value As String)
                _title = value
            End Set
        End Property

        Public Sub New(ByVal index As Integer, ByVal Title As String)
            Me.index = index
            Me.Title = Title
        End Sub
    End Class

    Public Class Library
        Private _Books As New ArrayList

        Public Property Books() As ArrayList
            Get
                Return _Books
            End Get
            Set(ByVal value As ArrayList)
                _Books = value
            End Set
        End Property

        Public Sub New()
            Dim Items As New ArrayList
            For i As Integer = 1 To 100
                Items.Add(New Item (i, "Book " & i)
            Next

            Me.Books = Items
        End Sub
    End Class


    Αρχικά τα Items μετατρέπονταν σε ένα strongly-typed array, το οποίο όμως δε βολεύει επειδή θέλω να προσθέτω αντικείμενα σε όλη τη διάρκεια της εκτέλεσης

    Απότι ξέρω συνήθως χρησιμοποιούνται Collections, αλλά ποιές είναι οι διαφορές τους σε σχέση με τα ArrayList? (Αν δεν κάνω λάθος τα μεν βασίζονται στα δε).

    Στην συγκεκριμένη περίπτωση τι είναι προτιμότερο?
  •  09-11-2007, 15:32 37153 σε απάντηση της 37150

    Απ: ArrayList vs. Collection

    Καλησπέρα John,

    Νομίζω ότι έχεις μπερδέψει το ArrayList με το Array, το ArrayList είναι ένα Collection, ένας εμπειρικός κανόνας για να τα ξεχωρίζεις είναι ότι τα Collections έχουν .Add() method.

    Το Array έχει fixed Length κατά το initialization

     πχ. (C#) Book [] _books = new Book[100];

    Ενώ το Collection είναι δυναμικό ως προς τον αριθμό τον object Που μπορεί να κρατήσει

    πχ (C#) List<Book> _books = new List<Book>();

    στην πρώτη περίπτωση μπορείς να εισάγεις το πολύ μέχρι 100 βιβλία (= new Book[100];)

    ενώ στην δεύτερη όσα θέλεις.

    Ps.Εσωτερικά το collection χρησιμοποιεί Array.

    Αν δεν χρησιμοποιείς το NET 1.1 τότε καλύτερα αντί του ArrayList που είναι ένα collection από object να χρησιμοποιήσεις List<T> όπου (T) είναι το type που επιθυμείς έτσι:

    Dim Items As New List<Book>

    Έτσι κάθε φορά που θες να πάρεις ένα βιβλίο από το collection δεν χρειάζεται να κάνεις mask στον κατάλληλο τύπο πχ

    ArrayList:

     Dim Items As New ArrayList
            For i As Integer = 1 To 100
                Items.
    Add(New Item (i, "Book " & i)
            Next

    Dim b As Book

    Set b = Items[0] --Εδώ θα σου χτυπήσει ο compiler ότι το Items[0] είναι τύπου object και όχι Book.

    ps. sorry που εμπλεξα VB και C#, αλλά η γνώση μου σε VB είναι σε νηπιακό επίπεδο.

    Νασσος


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  09-11-2007, 17:14 37166 σε απάντηση της 37153

    Απ: ArrayList vs. Collection

    Όχι, δεν τα έχω μπερδέψει, ξέρω τις διαφορές μεταξύ Collection και Array.  Big Smile

    Aκριβώς επειδή το ArrayList και το Collection (χρησιμοποιώντας CollectionBase) μοιάζουν τόσο πολύ, αναρωτιέμαι ποια είναι η διαφορά τους και τι θα ήταν καλύτερο.

    Το Collection χρησιμοποιεί εσωτερικά ένα ArrayList (και όχι απλό Array), το οποίο είναι προσβάσιμο μέσω της ιδιότητας List του Collection.

    Η απορία μου έγκειται στο τι παραπάνω μας προσφέρει το Collection. Tongue Tied


    Υ.Γ. Δε με πειράζει η c#! ευχαριστώ για την απάντηση!
  •  09-11-2007, 20:05 37176 σε απάντηση της 37166

    Απ: ArrayList vs. Collection

    Μάλλον θα πρέπει να αναρωτηθείς τι παραπάνω σου δίνει το ArrayList απο το Collection, κι όχι το αντίθετο.

    Η βασική τους διαφορά, είναι τα interfaces τα οποία υλοποιούν. Το CollectionBase, υλοποιεί το ICollection και το ΙEnumerable. Το ArrayList υλοποιεί ένα παραπάνω interface, το ΙList.

    Με πολύ λίγα λόγια, το ICollection είναι ένα read-only, forward-reading ( μέσω της GetEnumerator() μεθόδου που κληρονομεί απο το IEnumerable ) interface.

    To IList σου δίνει Add, Remove, Item[...] κι ένα σωρό άλλα πράγματα. Δεν είναι read-only interface, μπορείς να διαβάσεις items by index και άλλα. Θα τα δείς και στο MSDN reference αυτα.

    Οπότε η διαφορά τους δεν έχει να κάνει κυρίως με το performance, αλλά με το τί θες να μπορεί να κάνει ο κώδικας που θα χρησιμοποιήσει το Collection ή το List σου. Αν δε θές να μπορεί να προσθέσει ας πούμε κάποιος βιβλία στην κλάση σου "εξωτερικά" - καλώντας ας πούμε  youClass.Books.Add(myBook); -  αλλά μόνο μέσα απο κάποιο δικό σου method - yourClass.AddNewBook(myBook); - θα γυρίσεις ICollection. Αν όχι, IList ...

    Angel
    O:]
  •  09-11-2007, 21:45 37177 σε απάντηση της 37176

    Απ: ArrayList vs. Collection

    Η διαφορά ενός custom collection είναι ότι είναι type-safe και έτσι μπορείς να το χρησιμοποιείς χωρίς να κάνεις cast τα αντικείμενά του πρώτα στον τύπο που θέλεις.

    Συμπληρωματικά: Αν σε ενδιαφέρει το performance, και στην περίπτωση που σκοπεύεις να χρησιμοποιήσεις value types (πχ structs, αριθμούς κοκ), τότε θα έχεις κάποιο όφελος στο να χρησιμοποιήσεις κάποιο generic list (πχ το System.Collections.Generic.List<>) έναντι του ArrayList ή οποιουδήποτε άλλου Implementation καταλήγει σε Arraylist.

    Προσωπικά, με την έλευση του .net 2.0, έχω εγκαταλείψει τα non-generic collections και τις custom CollectionBase βασισμένες λίστες για χάρη των generic collections, παρά μόνο σε πολύ ειδικές περιπτώσεις.

    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  10-11-2007, 01:59 37181 σε απάντηση της 37176

    Απ: ArrayList vs. Collection

    ... μάλλον αναφέρεσαι σε generic ArrayList kai Collection; Και έγραφα άσχετα τόση ώρα;

    Η μόνη διαφορά μεταξύ ενός IList<T> με ένα ICollection<T> είναι ότι στο IList μπορείς να ζητήσεις/προσθέσεις/αφαιρέσεις κάποιο item by index, ενώ το ICollection<T> δε σου δίνει αυτή τη δυνατότητα:

    public interface ICollection<T> : IEnumerable<T>, IEnumerable
    {
        int Count { get; }

        bool IsReadOnly { get; }

        void Add(T item);

        void Clear();

        bool Contains(T item);

        void CopyTo(T[] array, int arrayIndex);

        bool Remove(T item);
    }


    public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
    {
        T this[int index] { get; set; }

        int IndexOf(T item);

        void Insert(int index, T item);

        void RemoveAt(int index);
    }



    Angel
    O:]
  •  10-11-2007, 22:38 37198 σε απάντηση της 37181

    Απ: ArrayList vs. Collection

    Τελικά έχω μπερδευτεί ακόμα περισσότερο Stick out tongue

    Τι είναι τα generic collections? πώς μπορώ να τα χρησιμοποιήσω?

    Εγώ θέλω κάτι στο οποίο να βάζω πολλά Books, και μετά κατά βούληση να αφαιρώ, να προσθέτω και να ψάχνω. Εννοείται ότι προτιμώ να μη χρειάζεται να τα κάνω cast κάθε φορά... Ποιό προτείνετε να χρησιμοποιήσω?


    Συγγνώμη που σας έχω πρήξει, αλλά τα βιβλία που έχω είναι για .net 1.1 και δε λένε για generic collections...
  •  11-11-2007, 05:51 37200 σε απάντηση της 37198

    Απ: ArrayList vs. Collection

    Σε γενικές γραμμές (και αρκετά μπακάλικα), generic είναι κάτι το οποίο μοιάζει με το εξής: ObjectType<Something>. Τι σημαίνει αυτό;

    Έστω ένα αντικείμενο List<Book>. Αυτό το αντικείμενο είναι μία λίστα που συμπεριφέρεται σαν ArrayList, αλλά δέχεται μόνο ορίσματα τύπου Book. Ένα αντικείμενο List<string> είναι το ίδιο αλλά δρα μόνο σε ορίσματα τύπου string (πχ πρόσθεση string, retrieve string από τη λίστα κλπ).
    Γενικοποιώντας τον ορισμό, ονομάζουμε το αντικείμενο αυτό List<> ή List<T>. Το Τ εδώ υποδηλώνει το placeholder για έναν τύπο (Type). Κατ' αναλογία, υπάρχει επίσης και η generic hashtable έκδοση, με ονομασία Dictionary<,> ή Dictionary<K,V> η οποία δέχεται δύο τύπους, έναν K για το κλειδί/key, και έναν V για την τιμή/value. Έτσι, ένα αντικείμενο Dictionary<int, Book> είναι ένα hashtable που χρησιμοποιεί τύπο int για τα κλειδιά, και τύπο Book για τις τιμές.


    Έτσι, αντί να καταφύγεις σε inheritance του CollectionBase για να φτιάξεις μία λίστα η οποία θα δέχεται μόνο αντικείμενα τύπου Book, μπορείς να πετύχεις το παραπάνω με τη χρήση των generics (πχ List<Book>).


    Φυσικά, η χρησιμότητα και οι εφαρμογές δεν εξαντλούνται εδώ (ούτε κατά διάνοια), αλλά η χρήση τους σε collections είναι μάλλον η συνηθέστερη χρησιμότητά τους.

    Μην αφήνετε τα media να σας "ταΐζουν"!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems