List.AddRange()
존재하지만 존재 IList.AddRange()
하지 않습니다.
이것은 나를 이상하게 생각합니다. 그 이유는 무엇입니까?
답변:
인터페이스는 구현하기 쉽고 "부엌을 제외한 모든 것"을 포함하지 않기 때문입니다. 추가 AddRange
하면 InsertRange
및 RemoveRange
(대칭) 을 추가해야합니다 . 더 나은 질문은 IList<T>
인터페이스와 유사한 인터페이스에 대한 확장 메서드가없는 이유 IEnumerable<T>
입니다. (에서 장소에 대한 확장 방법 Sort
, BinarySearch
... 유용 할 것이다)
IFoo
) 선언이 "도우미"네임 스페이스 (예 MyAssembly
) 를 지정하는 방법 (예 : 클래스가 구현을 주장 IFoo
하지만 메소드가 부족 int Bar(String)
하면 컴파일러가 자동 생성 방법 int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);}
이러한 기능이 존재했다면 인터페이스 AddRange
는 기본 동작 측면에서 구현할 수 있지만 일부 구현은 최적화 할 수있는 더 많은 방법을 포함 할 수 있습니다.
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는 다음과 같습니다.
AddRange/RemoveRange/InsertRange
는 "내부"컬렉션에서 직접 작업하고Capacity
관리를 최적화하고Array.Copy
데이터 블록을 이동 하는 것과 같은 방법을 사용할 수 있습니다 . 확장 방법RemoveRange
은 아마도보다 느린 순서List.RemoveRange