IList가 AddRange를 지원하지 않는 이유


89

List.AddRange()존재하지만 존재 IList.AddRange()하지 않습니다.
이것은 나를 이상하게 생각합니다. 그 이유는 무엇입니까?

답변:


68

인터페이스는 구현하기 쉽고 "부엌을 제외한 모든 것"을 포함하지 않기 때문입니다. 추가 AddRange하면 InsertRangeRemoveRange(대칭) 을 추가해야합니다 . 더 나은 질문은 IList<T>인터페이스와 유사한 인터페이스에 대한 확장 메서드가없는 이유 IEnumerable<T>입니다. (에서 장소에 대한 확장 방법 Sort, BinarySearch... 유용 할 것이다)


35
@ShdNx 성능 측면에서 구현하는 것은 그리 간단하지 않습니다. "내부" AddRange/RemoveRange/InsertRange는 "내부"컬렉션에서 직접 작업하고 Capacity관리를 최적화하고 Array.Copy데이터 블록을 이동 하는 것과 같은 방법을 사용할 수 있습니다 . 확장 방법 RemoveRange은 아마도보다 느린 순서 List.RemoveRange
xanatos

2
인터페이스 (예 IFoo) 선언이 "도우미"네임 스페이스 (예 MyAssembly) 를 지정하는 방법 (예 : 클래스가 구현을 주장 IFoo하지만 메소드가 부족 int Bar(String)하면 컴파일러가 자동 생성 방법 int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);} 이러한 기능이 존재했다면 인터페이스 AddRange는 기본 동작 측면에서 구현할 수 있지만 일부 구현은 최적화 할 수있는 더 많은 방법을 포함 할 수 있습니다.
supercat

1
확장 메서드로 구현할 수 있으므로 인터페이스 구현에서 구현할 필요가 없습니다. 왜 그렇지 않습니까?
Tom Pažourek 2013 년

15
이것은 말이되지 않습니다. 인터페이스는 구현을 추상화하므로 동일한 기본 기능의 여러 구현이있을 수 있습니다. "구현이 어렵 기 때문에"인터페이스에서 기능을 생략해야하는 이유가 없습니다. 인터페이스에 "AddRange"와 같은 메서드가 없으면 기본 개체가이를 지원한다는 보장이 없으며 그 시점에서 차선책 확장을 구현하거나 위험한 가정을 시도하여 인터페이스 사용 목적을 무력화해야합니다. 특정 구현 클래스로 캐스팅합니다. Dumbed-down 인터페이스가 과도하게 사용됩니다.
Triynko 2015 년

3
내부적으로 최적의 구현을 가질 일부 컬렉션에서만 구현되는 대량 작업을 지원하는 IRangeList 인터페이스가 있어야합니다.
너무

8

IList에서 "AddRange", "Sort", ...에 대한 확장 메서드를 갖고 싶은 사람들을 위해,

다음은 AddRange확장 방법입니다.

 public static void AddRange<T>(this IList<T> source, IEnumerable<T> newList)
 {
     if (source == null)
     {
        throw new ArgumentNullException(nameof(source));
     }

     if (newList == null)
     {
        throw new ArgumentNullException(nameof(newList));
     }

     if (source is List<T> concreteList)
     {
        concreteList.AddRange(newList);
        return;
     }

     foreach (var element in newList)
     {
        source.Add(element);
     }
}

이 작업을 수행하는 작은 라이브러리를 만들었습니다. 각 프로젝트에서 확장 방법을 다시 실행하는 것보다 더 실용적이라고 생각합니다.

일부 방법은 List보다 느리지 만 작업을 수행합니다.

관심을 가질만한 GitHub는 다음과 같습니다.

IListExtension 저장소

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.