Dlaczego warto korzystać Zkolekcji, a nie liczby lub listy na wielu-wielu/JEDEN-wiele relacji?

Widzę to często w samouczkach, z właściwościami nawigacji jako ICollection<T>.

Czy jest to obowiązkowy wymóg dla RAM podmiotowych? Czy mogę użyć IEnumerable?

Jaki jest główny cel używania ICollection zamiast IEnumerable lub nawet List<T>?

Author: Michael, 2012-04-12

8 answers

Zazwyczaj to, co wybierzesz, zależy od metod, do których potrzebujesz dostępu. Ogólnie - IEnumerable<> (MSDN: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx) dla listy obiektów, które wymagają tylko iteracji, ICollection<> (MSDN: http://msdn.microsoft.com/en-us/library/92t2ye13.aspx ) dla listy obiektów, które wymagają iteracji i modyfikacji, List<> dla listy obiektów, które wymagają iteracji, modyfikacji, posortowania itp. (zobacz tutaj pełna lista: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx).

Z bardziej konkretnego punktu widzenia, leniwe Ładowanie przychodzi grać z wyborem typu. Domyślnie właściwości nawigacji w ramach jednostek są dostarczane ze śledzeniem zmian i są proxy. Aby dynamiczny serwer proxy mógł zostać utworzony jako właściwość nawigacyjna, Typ wirtualny musi zaimplementować ICollection.

Właściwość nawigacyjna reprezentująca "wiele" końca relacji musi zwraca typ, który implementuje Ikollection, gdzie T jest typem obiektu na drugim końcu relacji. - wymagania dotyczące tworzenia Proxy POCO MSDN

Więcej informacji o definiowaniu i zarządzaniu relacjami MSDN

 360
Author: Travis J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-26 03:14:37

ICollection<T> jest używany, ponieważ interfejs IEnumerable<T> nie zapewnia możliwości dodawania elementów, usuwania elementów lub w inny sposób modyfikowania kolekcji.

 73
Author: Justin Niessner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-11 20:16:29

Odpowiadając na twoje pytanie o List<T>:

List<T> jest klasą; określenie interfejsu pozwala na większą elastyczność implementacji. Lepszym pytaniem jest " dlaczego nie IList<T>?"

Aby odpowiedzieć na to pytanie, zastanów się, co IList<T> dodaje do ICollection<T>: indeksowanie liczb całkowitych, co oznacza, że elementy mają dowolną kolejność i mogą być pobrane przez odniesienie do tej kolejności. Prawdopodobnie w większości przypadków nie ma to znaczenia, ponieważ elementy prawdopodobnie muszą być uporządkowane inaczej w różnych kontekstach.

 48
Author: phoog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-11 20:35:57

Istnieje pewna podstawowa różnica między ICollection a IEnumerable

  • IEnumerable - zawiera tylko metodę GetEnumerator, aby uzyskać Enumerator i wykonać pętlę
  • ICollection zawiera następujące metody-Add/Remove/Contains/Count / CopyTo
  • ICollection jest dziedziczona z IEnumerable
  • z ICollection możesz zmodyfikować kolekcję za pomocą metod takich jak add/remove, you dont have wolność, by zrobić to samo z liczbą mnogą.

Prosty Program:

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;
        }
    }
}
 10
Author: Ramakrishnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-24 05:37:15

Podstawową ideą korzystania z ICollection jest zapewnienie interfejsu do odczytu-dostępu do pewnej skończonej ilości danych. W rzeczywistości masz kolekcję.Count property. IEnumerable jest bardziej odpowiednie dla jakiegoś łańcucha danych, w którym czytasz do jakiegoś punktu logicznego, jakiegoś warunku esplicite określonego przez konsumenta lub do końca wyliczenia.

 8
Author: Tigran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 19:19:31

Pamiętam to tak:

  1. IEnumerable posiada jedną metodę GetEnumerator (), która umożliwia odczyt wartości w kolekcji, ale nie zapisanie do niej. Większość złożoności użycia enumeratora jest dla nas zadana przez polecenie for each w C#. IEnumerable posiada jedną właściwość: Current, która zwraca bieżący element.

  2. ICollection implementuje IEnumerable i dodaje kilka dodatkowych właściwości, z których najczęściej korzysta Count. The generic wersja ICollection implementuje metody Add() I Remove ().

  3. IList implementuje zarówno liczbę, jak Ikolekcję.

 3
Author: user3918295,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-15 13:57:53

To, co zrobiłem w przeszłości, to zadeklarować moje wewnętrzne Kolekcje klas za pomocą IList<Class>, ICollection<Class>lub IEnumerable<Class> (Jeśli lista statyczna) w zależności od tego, czy będę musiał wykonać dowolną liczbę z następujących metod w moim repozytorium: enumerate, sort/order lub modify. Kiedy po prostu muszę wyliczyć (a może posortować) obiekty, wtedy tworzę temp List<Class> do pracy z kolekcją w ramach metody liczbowej. Myślę, że ta praktyka byłaby skuteczna tylko wtedy, gdy zbiór jest stosunkowo mały, ale to może być dobra praktyka w ogóle, idk. Proszę mnie poprawić, jeśli istnieją dowody na to, dlaczego nie byłoby to dobrą praktyką.

 2
Author: yardpenalty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-24 18:32:26

Właściwości nawigacji są zazwyczaj definiowane jako wirtualne, dzięki czemu mogą korzystać z pewnych funkcji struktury encji, takich jak leniwe Ładowanie.

Jeśli właściwość nawigacyjna może zawierać wiele elementów (jak w relacjach od wielu do wielu lub od jednego do wielu), jej typem musi być lista, w której wpisy mogą być dodawane, usuwane i aktualizowane, takie jak Kolekcja.

Https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

 2
Author: LewisAntonio803,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-27 00:33:01