[.net] List (of T)와 Collection (of T)의 차이점은 무엇입니까?

나는 그것들이 같은 방식으로 많이 사용되는 것을 보았고, 내가 이것을 더 잘 이해하지 못하면 돌이킬 수없는 디자인의 길을 갈 까봐 걱정된다. 또한 .NET을 사용하고 있습니다.



답변

Collection<T>주위에 사용자 정의 가능한 래퍼 IList<T>입니다. 동안 IList<T>밀폐되지 않은, 어떤 사용자 정의 포인트를 제공하지 않습니다. Collection<T>의 메서드는 기본적으로 표준 IList<T>메서드에 위임 되지만 원하는 작업을 수행하도록 쉽게 재정의 할 수 있습니다. Collection<T>IList로 할 수 있다고 생각하지 않는 이벤트를 내부에 연결하는 것도 가능합니다 .

요컨대, 사실 이후에 확장하는 것이 훨씬 쉬우므로 잠재적으로 리팩토링이 훨씬 줄어들 수 있습니다.


답변

C #에는 개체 모음을 나타내는 세 가지 개념이 있습니다. 기능 증가 순서는 다음과 같습니다.

  • 열거 가능 -정렬되지 않고 수정할 수 없음
  • 컬렉션 -항목 추가 / 제거 가능
  • 목록 -항목이 순서를 가질 수 있도록 허용합니다 (인덱스로 액세스 및 제거).

Enumerable 에는 순서가 없습니다. 세트에서 항목을 추가하거나 제거 할 수 없습니다. 세트의 항목 수를 얻을 수도 없습니다. 세트의 각 항목에 차례로 액세스 할 수 있습니다.

수집 은 수정 가능한 집합입니다. 세트에서 객체를 추가 및 제거 할 수 있으며 세트의 항목 수를 가져올 수도 있습니다. 그러나 여전히 순서가없고 순서가 없기 때문에 인덱스로 항목에 액세스 할 수없고 정렬 할 방법도 없습니다.

목록 은 정렬 된 개체 집합입니다. 목록을 정렬하고, 인덱스로 항목에 액세스하고, 인덱스로 항목을 제거 할 수 있습니다.

실제로 이러한 인터페이스를 살펴보면 서로를 기반으로 구축됩니다.

  • interface IEnumerable<T>

    • GetEnumeration<T>
  • interface ICollection<T> : IEnumerable<T>

    • Add
    • Remove
    • Clear
    • Count
  • interface IList<T> = ICollection<T>

    • Insert
    • IndexOf
    • RemoveAt

변수 또는 메소드 매개 변수를 선언 할 때 다음을 사용하도록 선택해야합니다.

  • IEnumerable
  • ICollection
  • IList

개념적으로는 개체 집합을 처리해야합니다.

목록의 모든 개체에 대해 무언가를 수행 할 수 있어야한다면 다음 만 필요합니다 IEnumerable.

void SaveEveryUser(IEnumerable<User> users)
{
    for User u in users
      ...
}

[사용자가에 보관하는 경우 상관 없어 List<T>, Collection<T>, Array<T>다른 사람 또는 아무것도. 당신은IEnumerable<T>인터페이스 .

세트에서 항목을 추가, 제거 또는 계산할 수 있어야하는 경우 컬렉션 을 사용하십시오 .

ICollection<User> users = new Collection<User>();
users.Add(new User());

정렬 순서에 관심이 있고 올바른 순서가 필요한 경우 List 를 사용하십시오 .

IList<User> users = FetchUsers(db);

차트 형식 :

| Feature                | IEnumerable<T> | ICollection<T> | IList<T> |
|------------------------|----------------|----------------|----------|
| Enumerating items      | X              | X              | X        |
|                        |                |                |          |
| Adding items           |                | X              | X        |
| Removing items         |                | X              | X        |
| Count of items         |                | X              | X        |
|                        |                |                |          |
| Accessing by index     |                |                | X        |
| Removing by indexx     |                |                | X        |
| Getting index of item  |                |                | X        |

List<T>Collection<T>에서 System.Collections.Generic이 인터페이스를 구현하는 두 개의 클래스가 있습니다; 그러나 그들은 유일한 수업이 아닙니다.

  • ConcurrentBag<T>주문한 개체 가방입니다 ( IEnumerable<T>).
  • LinkedList<T>색인 ( ICollection)으로 항목에 액세스 할 수없는 가방입니다 . 하지만 컬렉션에서 항목을 임의로 추가 및 제거 할 수 있습니다.
  • SynchronizedCollection<T> 인덱스별로 항목을 추가 / 제거 할 수있는 정렬 된 컬렉션

따라서 다음을 쉽게 변경할 수 있습니다.

IEnumerable<User> users = new SynchronizedCollection<User>();

SaveEveryUser(users);

tl; dr

  • 열거 가능 -정렬되지 않고 수정할 수없는 액세스 항목
  • 컬렉션 -수정 가능 (추가, 삭제, 개수)
  • 목록 -색인으로 액세스 가능

선택 개념 당신이 필요를, 다음 일치하는 클래스를 사용합니다.


답변

List<T>응용 프로그램 코드 내에서 내부적으로 사용하기위한 것입니다. 수락하거나 반환하는 공개 API를 작성하지 않아야합니다.List<T> (대신 수퍼 클래스 또는 컬렉션 인터페이스 사용을 고려하십시오).

Collection<T> 사용자 지정 컬렉션에 대한 기본 클래스를 제공합니다 (직접 사용할 수 있음).

Collection<T>특정 기능이없는 경우 코드에서 사용 을 고려하십시오.List<T>필요한 .

위는 단지 권장 사항입니다.

[출처 : 프레임 워크 디자인 지침, 제 2 판]


답변

List<T>매우 다재다능하기 때문에 매우 일반적으로 사용되는 컨테이너입니다 ( Sort,Find 하지만 당신은 행동의 오버라이드 (override) 할 경우 (삽입에 대한 검사 항목을 예를 들어) 더 확장 지점이 없습니다 -, 등).

Collection<T>IList<T>(기본값은 List<T>) 주위의 래퍼입니다 . 확장 점 ( virtual메소드)이 있지만 Find. 간접적이므로.보다 약간 느리지 List<T>만 그다지 많지는 않습니다.

LINQ와에 여분의 방법 List<T>부터 덜 중요 해지고, 어쨌든을 제공하는 경향이있다 -에 – 객체 LINQ … 예를 들어 First(pred), OrderBy(...)


답변

목록이 더 빠릅니다.

예를 들어

private void button1_Click(object sender, EventArgs e)
{
  Collection<long> c = new Collection<long>();
  Stopwatch s = new Stopwatch();
  s.Start();
  for (long i = 0; i <= 10000000; i++)
  {
    c.Add(i);
  }
  s.Stop();
  MessageBox.Show("collect " + s.ElapsedMilliseconds.ToString());

  List<long> l = new List<long>();
  Stopwatch s2 = new Stopwatch();
  s2.Start();
  for (long i = 0; i <= 10000000; i++)
  {
    l.Add(i);
  }
  s2.Stop();
  MessageBox.Show("lis " + s2.ElapsedMilliseconds.ToString());


}

내 컴퓨터 List<>에서 거의 두 배 빠릅니다.

편집하다

사람들이 왜 이것을 반대하는지 이해할 수 없습니다. 직장 컴퓨터와 가정용 컴퓨터 모두 List <> 코드가 80 % 더 빠릅니다.


답변

목록은 항목의 순서가 중요한 컬렉션을 나타냅니다. 또한 정렬 및 검색 방법을 지원합니다. 컬렉션은 데이터에 대한 가정을 줄이고 데이터를 조작하는 방법을 더 적게 지원하는보다 일반적인 데이터 구조입니다. 사용자 지정 데이터 구조를 노출하려면 컬렉션을 확장해야합니다. 데이터 구조를 노출하지 않고 데이터를 조작해야하는 경우 목록이 더 편리한 방법 일 것입니다.


답변

이것은 대학원 질문 중 하나입니다. 컬렉션 T는 일종의 추상입니다. 기본 구현이있을 수 있지만 (나는 .net / c # 사람이 아닙니다) 컬렉션에는 추가, 제거, 반복 등과 같은 기본 작업이 있습니다.

T 목록은 이러한 작업에 대한 몇 가지 세부 사항을 암시합니다. add는 일정한 시간이 걸리고 remove는 요소 수에 비례하는 시간이 걸리고 getfirst는 일정한 시간이 필요합니다. 일반적으로 목록은 일종의 컬렉션이지만 컬렉션이 반드시 일종의 목록은 아닙니다.