2009-07-22 7 views
2

.NET 용 일반 콜렉션 알고리즘 라이브러리가 있습니까? 나는 이런 식으로 뭔가를 쓸 수 있도록하고 싶습니다 :C#의 일반 콜렉션 알고리즘

IList<T> items = GetItemsFromSomeWhere(); 
Algorithms<T>.Sort(items); 
// 
// .... 
// 
T item = GetItemSomwHow(); 
int i = Algorithms<T>.IndexOf(items, item); 

주, itemsList<T> 아니라고, 그렇지 않으면 나는 단순히 List<T>.SortList<T>.BinarySearch 방법을 사용할 수 있습니다. 물론

, 내가 그들에게 자신을 구현할 수있다, 난 그냥 바퀴를 재발견하고 싶지 않아요.

효율적인 구현을 원합니다.

P.

어떤 컬렉션을 사용할 지 조언하지 마십시오. 나는 Array 또는 List<T> 능력을 완벽하게 알고 있습니다. 필요한 것은 IList<T> 기반 컬렉션에서 작동하는 알고리즘 라이브러리입니다.

편집 : 나는 내 자신의 대답을 찾았습니다.

+1

얘들 아, 할 일이 없니? – mark

답변

1

몇 가지 연구를하고 후에 나는 Wintellect에서 PowerCollections 라이브러리를 발견했다.

은 이외에도 다양한 컬렉션을 공급에서 어떤IList<T>을 기대 BinarySearch<T>SortInPlace<T>을 포함하여 꽤 많은 알고리즘과 정적 Algorithms 클래스를 제공합니다.

1

System.Linq.Enumerable class는 좋은 물건을 잔뜩 않습니다. 틀림없이, 그것은 약간의 물건을 놓치지 만 그럼에도 불구하고 적용 가능하다.

+2

아니요; 이진 검색을 수행하지 않습니다. – SLaks

+0

이진 검색은 O (1) 인덱스 기반 액세스 시간이있는 목록에만 적용 할 수 있습니다. 'Array.BinarySearch'는 배열을 위해 그것을 할 것입니다. –

+0

얘들 아, 나는 목록 또는 T []가 아닌 IList 을 가지고있다. 모든 IList 기반 컬렉션에 대한 솔루션이 필요합니다. Array.BinarySearch가 나를 어떻게 돕고 있습니까? – mark

0

Array 클래스가 유용 할 수도 있습니다 (SortIndexOf).

다음을 수행 할 수 없습니다 :

 IList<string> foo = new List<string>(); 
     foo.Add("hi"); 
     foo.Add("bye"); 
     string[] foo_temp = new string[foo.Count]; 
     foo.CopyTo(foo_temp, 0); 
     Array.Sort<String>(foo_temp); 
     foo = new List<string>(foo_temp); 
+0

나는 묻는 사람이 컬렉션을 사용할 컬렉션에 대해 묻지 않고 일반 컬렉션을 작동시키는 알고리즘을 찾고 있다고 생각한다. –

+0

아니요; 배열에서만 작동합니다. 그는 'IList ' – SLaks

+0

Array.BinarySearch SwDevMan81

0

당신은 그냥있는 OrderBy 확장 방법 LINQ에 대한 정의를 주었다. SortedList <>의

+0

아니요; 그는 제자리에서 정렬하고 싶습니다 – SLaks

+0

정렬은 단지 하나의 예라고 생각합니다. LINQ는 많은 컬렉션 조작 기능을 가지고 있지만 다른 물건에 관심이 있다고 생각합니다. 교차로, 합집합 등을 구현하는 집합 을 보았지만 원하는지 확실하지 않습니다. – n8wrl

0

IndexOfKey있어서 내부적 BinarySearch을한다.

2

불행하게도, .NET은 IList<T> 인터페이스와 함께 작동 BinarySearch 구현에 내장 제공하지 않습니다.

다른 포스터에서 언급 한 것처럼 일반 목록을 정렬하는 데 Linq를 사용할 수 있습니다. 그러나 IList<T>에 대한 이진 검색의 경우 check out the following SO post을 제안합니다.

많은 사람들이 유사한 문제를 해결하기 위해 자신의 유틸리티를 구현했다고 의심하지만, Linq의 틈을 채우기 위해 사용할 수있는 좋은 범용 알고리즘 라이브러리는 잘 모릅니다.

+0

내 대답을 확인하십시오. – mark

0

사용중인 데이터 구조와 실제로 사용할 수있는 알고리즘을 생각해보십시오. 컬렉션에 대해 읽지 않으려는 것을 알고 있지만 분명히 연결된 목록에서 이진 검색이 작동하지 않습니다. 어떤 종류의 알고리즘이 필요합니까? 효율적인 정렬 알고리즘은 이미 있습니다. Linq 및 .NET 컬렉션은 필요한 모든 것을 제공해야합니다.

+0

아니요, 그는 IList 알고리즘을 원합니다. BCL에서 IList에 대해 구현할 수있는 두 가지 예제가 있지만 현재는 그렇지 않습니다. 목록 및 배열에 연결됩니다. –

0

이 문제도 발생했습니다. 내 솔루션 List.SortArray.BinarySearch의 구현을 찾아 IList<T>에 대한 확장 메서드로 재 작성 Reflector를 사용하는 것이 었습니다.

확장 프로그램으로 작성하지 않지만 일반적인 정적 방법 (예 :

Algorithms<T>.Sort(items); 

그냥 평범한 정적 (비 제네릭) 클래스 Algorithms에, 정적 일반적인 방법 Sort을하고, 형식 유추 할 것입니다 : 당신이 C# 2)를 사용하는 경우, 당신은 당신의 정확한 구문이 필요하지 않습니다 인수의 유형을보고하여 나머지 :

Algorithms.Sort(items); 
+0

내 대답을 확인하십시오. – mark

1

당신은 템플릿으로 라이브러리를 사용할 수 있습니다 : 그것은 Generic Sorting Library

진행중인 작업은 여전히 ​​모든 정렬 알고리즘이 포함되어 있지 않습니다. 그러나 템플릿으로 사용하여 빌드 할 수 있습니다.

IList를 통해 확장 메서드로 sort()를 노출하고 정렬 알고리즘과 비교자를 지정해야합니다. 코드는 다음과 같이 작성 될 수 있습니다.

  int[] sortingArray = { 12, 5, 2, 7, 66 }; 
      IComparer<int> comparer = new SortComparer(); 
      sortingArray.Sort(SortStrategy.HeapSort, comparer); 

이 정보가 도움이되는지 알려주십시오.