DEV Community

Διαφορές μεταξύ IEnumerable, IQueryable και List σε Απόδοση και Χρήση

Ας δούμε αναλυτικά τις διαφορές μεταξύ 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);
Enter fullscreen mode Exit fullscreen mode
  • Οποιαδήποτε αλλαγή στα αντικείμενα μέσα στο 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);
Enter fullscreen mode Exit fullscreen mode

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];
Enter fullscreen mode Exit fullscreen mode

Rule of Thumb

  • IEnumerable: Όταν τα δεδομένα είναι ήδη στη μνήμη και θέλεις LINQ queries.
  • IQueryable: Όταν τα δεδομένα είναι σε remote collections και θες optimized queries στον server.
  • List: Όταν χρειάζεσαι πλήρη, τροποποιήσιμη in-memory collection με άμεση πρόσβαση.

Πηγές

Microsoft Docs - IEnumerable Interface

Microsoft Docs - IQueryable Interface

Microsoft Docs - List Class

LINQ Overview

dotnettutorials.net


30 Ερωτήσεις για .NET Senior Developer


nikosst

Top comments (0)