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>
?
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
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.
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.
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;
}
}
}
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.
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:
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.
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 ().
IList implementuje zarówno liczbę, jak Ikolekcję.
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ą.
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.
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