Ας δούμε αναλυτικά τις διαφορές μεταξύ IEnumerable, IQueryable και List στο C# με έμφαση στην απόδοση και τη χρήση, συμπεριλαμβάνοντας και την περίπτωση αντικειμένων/κλάσεων.
IEnumerable
- Είναι interface που αναπαριστά μια ακολουθία αντικειμένων που μπορεί να επαναληφθεί.
- Μπορεί να περιέχει οποιοδήποτε τύπο αντικειμένου: primitives, structs ή custom classes.
Χαρακτηριστικά:
- Execution: Deferred execution για LINQ queries σε in-memory collections.
- Εκτέλεση στο memory: Όλα τα δεδομένα πρέπει να είναι φορτωμένα στη μνήμη.
- Απόδοση: Καλή για μικρές ή μεσαίες συλλογές, αλλά σε μεγάλες συλλογές η επεξεργασία γίνεται στον client.
- Χρήση: Όταν δουλεύουμε με εσωτερικές συλλογές (π.χ. List, Array) που υπάρχουν ήδη στη μνήμη.
Παράδειγμα με αντικείμενα:
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
IEnumerable<User> users = new List<User>
{
new User { Name = "Alice", Age = 25 },
new User { Name = "Bob", Age = 17 },
new User { Name = "Charlie", Age = 30 }
};
var adults = users.Where(u => u.Age >= 18);
- Οποιαδήποτε αλλαγή στα αντικείμενα μέσα στο IEnumerable αντικατοπτρίζεται στην αρχική συλλογή.
Με άλλα λόγια δημιουργούμε τα αντικείμενα μιας κλάσης και τα βάζουμε σε μια λίστα λίστα που αργότερα θα είναι προσπελάσιμη.
IQueryable
- Είναι interface για queries σε remote data sources (π.χ. βάσεις δεδομένων μέσω Entity Framework).
- Υποστηρίζει deferred execution και μετατροπή query σε SQL.
Χαρακτηριστικά:
- Execution: Deferred execution, query μετατρέπεται σε SQL και εκτελείται στον server.
- Απόδοση: Πολύ καλύτερη για μεγάλες βάσεις δεδομένων, επιστρέφοντας μόνο τα απαιτούμενα δεδομένα.
- Χρήση: Όταν δουλεύουμε με remote collections και θέλουμε φίλτρα, ταξινόμηση ή projections να γίνονται στον server.
Παράδειγμα με αντικείμενα:
IQueryable<User> users = dbContext.Users;
var adults = users.Where(u => u.Age >= 18);
List
- Είναι concrete class, in-memory collection.
- Περιέχει όλα τα στοιχεία πλήρως φορτωμένα στη μνήμη.
- Υποστηρίζει indexing, add, remove, etc.
Χαρακτηριστικά:
- Execution: Immediate execution, όλα τα στοιχεία είναι ήδη στο memory.
- Απόδοση: Πολύ γρήγορη για πρόσβαση με index και μικρές έως μεσαίες συλλογές.
- Χρήση: Όταν χρειάζεσαι άμεση πρόσβαση με index ή μετατροπή σε collection που μπορεί να τροποποιηθεί.
Παράδειγμα με αντικείμενα:
List<User> users = new List<User>
{
new User { Name = "Alice", Age = 25 },
new User { Name = "Bob", Age = 17 },
new User { Name = "Charlie", Age = 30 }
};
users.Add(new User { Name = "Dave", Age = 22 });
var firstUser = users[0];
Rule of Thumb
- IEnumerable: Όταν τα δεδομένα είναι ήδη στη μνήμη και θέλεις LINQ queries.
- IQueryable: Όταν τα δεδομένα είναι σε remote collections και θες optimized queries στον server.
- List: Όταν χρειάζεσαι πλήρη, τροποποιήσιμη in-memory collection με άμεση πρόσβαση.
Πηγές
Microsoft Docs - IEnumerable Interface
Microsoft Docs - IQueryable Interface
30 Ερωτήσεις για .NET Senior Developer
nikosst
Top comments (0)