449 Stimmen

Warum ICollection und nicht IEnumerable oder List<T> bei Many-Many/One-Many-Beziehungen verwenden?

Ich sehe das oft in Tutorials, mit Navigationseigenschaften wie ICollection<T> .

Ist dies eine zwingende Voraussetzung für Entity Framework? Kann ich verwenden IEnumerable ?

Was ist der Hauptzweck der Verwendung von ICollection 代わりに IEnumerable oder sogar List<T> ?

0 Stimmen

Also die Antwort ist, es ist nicht zwingend ICollection zu verwenden. und ich kann IEnumerable verwenden, wenn Iteration ist alles, was ich will. richtig?

515voto

Travis J Punkte 78877

In der Regel hängt die Wahl davon ab, zu welchen Methoden Sie Zugang benötigen. Im Allgemeinen - IEnumerable<> (MSDN: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx ) für eine Liste von Objekten, die nur durchlaufen werden muss, ICollection<> (MSDN: http://msdn.microsoft.com/en-us/library/92t2ye13.aspx ) für eine Liste von Objekten, die iterativ durchlaufen und geändert werden muss, List<> für eine Liste von Objekten, die durchlaufen, geändert, sortiert usw. werden müssen (eine vollständige Liste finden Sie hier: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx ).

Von einem spezifischeren Standpunkt aus betrachtet, kommt Lazy Loading bei der Auswahl des Typs ins Spiel. Standardmäßig werden Navigationseigenschaften in Entity Framework mit Änderungsverfolgung geliefert und sind Proxys. Damit das dynamische Proxy als Navigationseigenschaft erstellt werden kann, muss der virtuelle Typ muss implementieren ICollection .

Eine Navigationseigenschaft, die das "viele" Ende einer Beziehung darstellt, muss einen Typ zurückgeben, der ICollection implementiert, wobei T der Typ des Objekts am anderen Ende der Beziehung ist. - Voraussetzungen für die Erstellung von POCO-Proxies MSDN

Weitere Informationen zur Definition und Verwaltung von Beziehungen MSDN

3 Stimmen

Also, in diesem Sinne, List sollte viel besser sein, ja?

3 Stimmen

@JanCarloViray - Ich neige dazu, die List eine Menge. Es hat zwar den größten Overhead, bietet aber auch die meisten Funktionen.

1 Stimmen

Listen werden eher durch ihre Indexer definiert als durch die Möglichkeit, sie zu sortieren (ein Integer-Indexer erleichtert das Sortieren, ist aber keine Voraussetzung).

117voto

Justin Niessner Punkte 235353

ICollection<T> wird verwendet, weil die IEnumerable<T> Schnittstelle bietet keine Möglichkeit, Elemente hinzuzufügen, zu entfernen oder die Sammlung anderweitig zu ändern.

4 Stimmen

Was ist mit dem Vergleich mit List<T>?

17 Stimmen

List<T> implementiert ICollection<T> .

4 Stimmen

Die nicht-generische ICollection bietet keine Möglichkeit, Gegenstände hinzuzufügen, aber es ist dennoch eine nützliche Ergänzung zu IEnumerable<T> denn sie bietet eine Count Mitglied, was in der Regel viel schneller ist, als alles aufzuzählen. Beachten Sie, dass wenn ein IList<Cat> o ICollection<Cat> wird an Code übergeben, der eine IEnumerable<Animal> die Count() Erweiterungsmethode wird schnell sein, wenn sie die nicht-generische ICollection aber nicht, wenn es nur die generischen Schnittstellen implementiert, da eine typische ICollection<Cat> wird nicht umgesetzt ICollection<Animal> .

71voto

phoog Punkte 40628

Als Antwort auf Ihre Frage nach List<T> :

List<T> ist eine Klasse; die Angabe einer Schnittstelle ermöglicht mehr Flexibilität bei der Implementierung. Eine bessere Frage ist "warum nicht IList<T> ?"

Um diese Frage zu beantworten, sollten Sie überlegen, was IList<T> fügt hinzu ICollection<T> : Ganzzahlige Indizierung, d.h. die Elemente haben eine beliebige Reihenfolge und können durch Bezugnahme auf diese Reihenfolge abgerufen werden. Dies ist wahrscheinlich in den meisten Fällen nicht sinnvoll, da die Elemente in verschiedenen Kontexten wahrscheinlich unterschiedlich geordnet werden müssen.

41voto

Ramakrishnan Punkte 4904

Es gibt einige grundlegende Unterschiede zwischen ICollection und IEnumerable

  • IEnumerable - enthält nur die GetEnumerator-Methode zum Abrufen von Enumerator und ermöglicht Schleifenbildung
  • ICollection enthält zusätzliche Methoden: Add, Remove, Contains, Count, CopyTo
  • ICollection wird von IEnumerable geerbt
  • Mit ICollection können Sie die Sammlung mit Hilfe von Methoden wie add/remove ändern. Bei IEnumerable haben Sie nicht die Freiheit, dasselbe zu tun.

Einfaches Programm:

using System;
using System.Collections;
using System.Collections.Generic;

namespace StackDemo
{
    class Program 
    {
        static void Main(string[] args)
        {
            List<Person> persons = new List<Person>();
            persons.Add(new Person("John",30));
            persons.Add(new Person("Jack", 27));

            ICollection<Person> personCollection = persons;
            IEnumerable<Person> personEnumeration = persons;

            // IEnumeration
            // IEnumration Contains only GetEnumerator method to get Enumerator and make a looping
            foreach (Person p in personEnumeration)
            {                                   
               Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age);
            }

            // ICollection
            // ICollection Add/Remove/Contains/Count/CopyTo
            // ICollection is inherited from IEnumerable
            personCollection.Add(new Person("Tim", 10));

            foreach (Person p in personCollection)
            {
                Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age);        
            }
            Console.ReadLine();

        }
    }

    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
    }
}

22voto

user3918295 Punkte 195

Ich erinnere mich an diese Zeit:

  1. IEnumerable verfügt über eine Methode GetEnumerator(), mit der man die Werte in einer Sammlung lesen, aber nicht in sie schreiben kann. Der größte Teil der Komplexität der Verwendung des Enumerators wird durch die for each-Anweisung in C# übernommen. IEnumerable hat eine Eigenschaft: Current, die das aktuelle Element zurückgibt.

  2. ICollection implementiert IEnumerable und fügt einige zusätzliche Eigenschaften hinzu, von denen die am häufigsten verwendete Count ist. Die generische Version von ICollection implementiert die Methoden Add() und Remove().

  3. IList implementiert sowohl IEnumerable als auch ICollection und fügt den Integer-Indexierungszugriff auf Elemente hinzu (was normalerweise nicht erforderlich ist, da die Bestellung in der Datenbank erfolgt).

4 Stimmen

Ausgehend von dem, was Sie geschrieben haben, sind ICollection und IList dasselbe. Bitte fügen Sie hinzu, was zu IList hinzugefügt wird, das in ICollection nicht vorhanden ist.

0 Stimmen

ICollection VS IList, IList- einzige Schnittstelle in der System.Collection, die alle Funktionen von IEnumerable und ICollection und zusätzliche Funktionen enthält. IList hat Insert und Remove Methoden. Beide Methoden akzeptieren Index in ihrem Parameter. Es unterstützt also indexbasierte Operationen über die Sammlung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X