내비게이션 속성이와 같은 자습서 에서이 내용을 많이 볼 수 ICollection<T>
있습니다.
이것이 Entity Framework의 필수 요구 사항입니까? 사용할 수 있습니까 IEnumerable
?
ICollection
대신 IEnumerable
또는 심지어 사용하는 주요 목적은 무엇입니까 List<T>
?
답변
일반적으로 선택하는 것은 액세스해야하는 방법에 따라 다릅니다. 일반적으로- IEnumerable<>
(MSDN : http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx )를 통해 반복해야하는 개체 목록 ICollection<>
(MSDN : http : // msdn.microsoft.com/ko-kr/library/92t2ye13.aspx )를 통해 반복 및 수정 List<>
해야하는 개체 목록, 반복, 수정, 정렬 등을 수행해야하는 개체 목록 (여기 참조) 전체 목록 : http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx ).
보다 구체적인 관점에서, 유형 선택에 따라 지연 로딩이 발생합니다. 기본적으로 Entity Framework의 탐색 속성에는 변경 내용 추적 기능이 있으며 프록시입니다. 동적 프록시를 탐색 특성으로 작성하려면 가상 유형 이 구현 되어야 합니다 ICollection
.
관계의 “많은”끝을 나타내는 탐색 속성은 ICollection을 구현하는 형식을 반환해야합니다. 여기서 T는 관계의 다른 쪽 끝에있는 개체의 형식입니다. – POCO 프록시 생성을위한 요구 사항 MSDN을
답변
ICollection<T>
IEnumerable<T>
인터페이스는 항목을 추가하거나 제거하거나 컬렉션을 수정하는 방법을 제공하지 않기 때문에 사용됩니다 .
답변
에 대한 귀하의 질문에 답변 List<T>
:
List<T>
클래스입니다. 인터페이스를 지정하면 구현의 유연성이 향상됩니다. 더 좋은 질문은 “왜 안돼 IList<T>
?”입니다.
이 질문에 답하려면 정수 인덱싱에 IList<T>
추가 할 ICollection<T>
항목 을 고려하십시오 . 즉, 항목에 임의의 순서가 있으며 해당 순서를 참조하여 검색 할 수 있습니다. 항목은 다른 상황에서 다르게 주문해야하기 때문에 이것은 대부분의 경우 의미가 없습니다.
답변
ICollection과 IEnumerable 간에는 몇 가지 기본 차이점이 있습니다.
- IEnumerable -Enumerator를 가져 오기 위해 GetEnumerator 메소드 만 포함하며 루핑을 허용합니다.
- ICollection 에는 추가, 제거, 포함, 개수, CopyTo와 같은 추가 메서드가 포함됩니다.
- ICollection 은 IEnumerable에서 상속됩니다.
- ICollection을 사용하면 add / remove와 같은 메소드를 사용하여 콜렉션을 수정할 수 있습니다. IEnumerable과 같은 일을 할 자유가 없습니다.
간단한 프로그램 :
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;
}
}
}
답변
이런 식으로 기억합니다.
-
IEnumerable에는 컬렉션의 값을 읽을 수는 있지만 쓸 수는없는 GetEnumerator () 메서드가 있습니다. 열거자를 사용하는 복잡성의 대부분은 C #의 각 문마다 처리됩니다. IEnumerable에는 Current 요소가 하나 있는데 현재 요소를 반환합니다.
-
ICollection은 IEnumerable을 구현하고 가장 많이 사용되는 속성이 Count 인 몇 가지 추가 속성을 추가합니다. ICollection의 일반 버전은 Add () 및 Remove () 메서드를 구현합니다.
-
IList는 IEnumerable과 ICollection을 모두 구현하고 항목에 정수 색인 액세스를 추가합니다 (주문이 데이터베이스에서 수행 될 때 일반적으로 필요하지 않음).
답변
사용의 기본 아이디어는 ICollection
유한 한 양의 데이터에 대한 읽기 전용 액세스를위한 인터페이스를 제공하는 것입니다. 실제로 ICollection.Count 속성이 있습니다. IEnumerable
논리적 지점, 소비자가 암시 적으로 지정한 조건 또는 열거의 끝까지 읽는 일부 데이터 체인에 더 적합합니다.
답변
탐색 속성은 일반적으로 지연로드와 같은 특정 Entity Framework 기능을 활용할 수 있도록 가상으로 정의됩니다.
탐색 특성이 여러 엔티티 (다 대다 또는 일대 다 관계에서와 같이)를 보유 할 수있는 경우 해당 유형은 ICollection과 같이 항목을 추가, 삭제 및 업데이트 할 수있는 목록이어야합니다.