문제

ILIST <T>에서 이진 검색을 분류하거나 수행 할 수있는 직접적인 방법이 없다는 것을 알았을 때 나는 놀랐습니다. 배열에서 이진 검색을 정렬하고 수행하는 정적 방법이있는 것처럼, Ilist <t>를 취하는 유사한 정적 방법을 갖는 것이 매우 도움이된다고 생각합니다.

현재:

class Array
{
    static Sort<T>(T[] array);
    static int BinarySearch<T>(T[] array, T item);
}

나는 그들이 추가하기를 바랍니다.

class List
{
    static Sort<T>(IList<T> list);
    static int BinarySearch<T>(IList<T> list, T item);
}

.NET 프레임 워크 4.0 베타 SDK를 보았습니다. 아직 이 문제에 대한 해결책이 아닌 것 같습니다.

나는 그것이 목록인지 확인한 다음 목록 <t> 인스턴스를 사용하여 정렬/검색을 확인하는 확장 메소드를 만들어이 문제를 해결할 수 있다는 것을 알고 있습니다. 그러나 List <T>의 인스턴스가 아닌 경우 사본을 수행해야합니다 (매우 큰 목록을 위해 악취가납니다). 나는이 모든 것을 할 수 있다는 것을 알고 있지만 왜 그런가? 그들이이 기능을 의도적으로 생략 한 이유가 있습니까?

.NET 4.0 프레임 워크에서 이것을 얻으려면 Microsoft의 Connect 프로그램을 통해 제안을 만들었습니다. 이 문제에 대해 저처럼 좌절한다면 투표하면 추가 될 것입니다.

https://connect.microsoft.com/visualstudio/feedback/viewfeedback.aspx?feedbackid=474201

도움이 되었습니까?

해결책

LINQ에는 모든 ienumerable에서 작동하는 Orderby 메소드가 있습니다.u003CT> Ilist를 포함하여u003CT> . Orderby를 사용하여 동일한 것을 달성 할 수 있습니다.

// Order a list of addresses:
IList<string> list = ...
var orderedList = list.OrderBy(input => input);

다른 팁

나는 일종의 종류의 방법을 포함하지 않는 꽤 좋은 사례가 있다고 생각합니다. IList<T>. 먼저, 그것은 Ilist를 구현하려는 사람들에게 추가적인 복잡성을 만들고 두 번째는 Ilist 인터페이스가 인터페이스 분리 원리.

일반적으로 IList<T> 새로운 것을 창조합니다 List<T> 그리고 통과 IList<T> 매개 변수로

예를 들어 :

        public IList<Address> SortAddresses(IList<Address> addresses)
        {
            var sortedAddresses = new List<Address>(addresses);
            sortedAddresses.Sort();
            return sortedAddresses;
        }

좋은 소식은 당신이 할 수 있다는 것입니다 쓰다 그러한 방법은 상당히 쉽게 쉽게; C# 3.0 확장 방법 덕분에 인터페이스 에서이 작업을 수행 할 수 있습니다.

public static class ListExt
{
    public static void AddRange<T>(this IList<T> list, IEnumerable<T> items) {
        foreach(T item in items) list.Add(item);
    }
    public static void Sort<T>(this IList<T> list) {
        Sort<T>(list,Comparer<T>.Default); // ordinal sort by default
    }
    public static void Sort<T>(this IList<T> list, IComparer<T> comparer)
    { // very poor implementation!
        List<T> concreteList = new List<T>(list);
        concreteList.Sort(comparer); // cheat!
        list.Clear();
        list.AddRange(concreteList);
    }
    public static int BinarySearch<T>(this IList<T> list, T item) {
        return BinarySearch<T>(list, item, Comparer<T>.Default);
    }
    public static int BinarySearch<T>(this IList<T> list, T item,
        IComparer<T> comparer)
    {...} // TODO
}

이제 남아있는 것은 Todo 코드 자체입니다 (및 Probaby Re-Brite Sort ;-피); 그러나 그 후 :

IList<T> list = ...
list.Sort();
T huntFor = ...
int i = list.BinarySearch(huntFor);

중요하게도, IList<T> 읽기/쓰기 인덱서가 있으므로 위의 해킹없이 정렬 및 이진 검색을 모두 수행 할 수 있습니다.

당신은 가지고 있습니다 ArrayList.Adapter 그것은 사용을 허용합니다 ArrayList정렬 루틴이지만, 비스듬한 값 유형의 일반적인 목록과 가상 호출 및 인터페이스 디스패치 오버 헤드에 큰 성능에 영향을 미칩니다.

참조 및 값 유형의 경우 인터페이스 디스패치는 비용이 많이들 수 있습니다. ICollection<T>.CopyTo 배열 T[] 이어서 별도의 정렬은 가장 빠른 범용 옵션이 될 수 있습니다. IList<T> 물체.

List<T> a Sort 할 수 있기 때문에 방법 매우 기본 유형 배열에서 효율적으로 작동합니다 T[]. 임의의 경우 이것을 할 수있는 방법이 없습니다. IList<T>.

저는 C# 전문가는 아니지만 정렬, 이진 검색 또는 색인 검색을 지원하는 목록 구현은 거의 없습니다. 목록은 일반적으로 기반입니다 링크 된 목록 일반적으로 제공하지 않습니다 O(1) 인덱스별로 항목을 검색하는 방법. 요소를 빨리 찾으려면 요소를 정렬 된 순서로 유지하는 것을 사용합니다. 나무 또는 다른 사람들이 제안한 배열.

나는 그 사실을 발견합니다 IList 포함 색인 검색 방법 흥미로운. 사용을 고려하고 싶을 수도 있습니다 SortedList 대신에 List 인덱스 또는 키로 조회를 지원 해야하는 것처럼 보이므로 O(1) 시각. 일반적으로 빠른 조회를 지원하는 것이 필요한 경우 명시 적으로 정렬하는 대신 요소를 순서대로 유지하는 데이터 구조를 찾으십시오. 다른 것이 없다면 C#에는 이미 많은 데이터 구조가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top