2009-07-22 2 views
2

Существует ли библиотека общих алгоритмов сбора данных для .NET? Я хотел бы быть в состоянии написать что-то вроде этого:Алгоритмы общей коллекции в C#

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

Обратите внимание, что items не List<T>, в противном случае я мог бы просто использовать List<T>.Sort и List<T>.BinarySearch методы.

Конечно, я могу реализовать их сам, я просто не хочу изобретать велосипед.

Я также хотел бы, чтобы реализация была эффективной.

P.S.

Пожалуйста, не сообщайте, какие коллекции использовать. Я прекрасно осведомлен о способностях Array или List<T>. Мне нужна библиотека алгоритмов для работы с любой коллекцией IList<T>.

EDIT: Обнаружено то, что мне нужно - см. Мой собственный ответ.

+1

Ребята, вам больше нечего делать? – mark

ответ

1

После выполнения некоторых исследований я нашел PowerCollections библиотеку из Wintellect.

Помимо поставки различных коллекций обеспечивает статическую Algorithms класса с достаточно нескольких алгоритмов, в том числе BinarySearch<T> и SortInPlace<T>, которые ожидают любойIList<T>.

1

System.Linq.Enumerable class делает кучу хороших вещей. По общему признанию, он пропускает некоторые вещи, но, тем не менее, применим.

+2

Нет; он не выполняет двоичные запросы – SLaks

+0

Ну, бинарный поиск применим только к спискам с O (1) временем доступа на основе индекса. 'Array.BinarySearch' будет делать это для массивов. –

+0

Ребята, у меня есть IList , а не список или T []. Мне нужно решение для любой коллекции IList . Итак, как мне помогает Array.BinarySearch? – mark

0

Класс Array класс может работать для вас (Sort и IndexOf).

могли бы сделать следующее:

 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

Вы просто дали определение для LINQ с методом расширения OrderBy.

+0

Нет; он хочет сортировать на месте – SLaks

+0

Я думаю, что сортировка - всего лишь пример - LINQ имеет множество функций для управления коллекцией, но я подозреваю, что он заинтересован в других вещах. Я видел Set реализации, которые выполняют пересечение, объединение и т. Д., Но не уверены, что это то, что он хочет. – n8wrl

0

IndexOfKey метод СортировкаList <> делает BinarySearch внутренне.

2

К сожалению, .NET не предоставляет встроенные реализации BinarySearch, которые работают с интерфейсом IList<T>.

Вы можете использовать Linq для сортировки своего общего списка, как упомянули другие плакаты. Но для бинарного поиска на IList<T> я бы предложил вам check out the following SO post.

Я не знаю хорошей библиотеки алгоритмов общего назначения, которую можно использовать для заполнения пробелов в Linq, хотя я подозреваю, что многие люди внедрили свои собственные утилиты для решения подобных проблем.

+0

Проверьте мой собственный ответ. – mark

0

Подумайте, какие структуры данных вы используете и какие алгоритмы на самом деле возможны на нем. Я знаю, что вы не хотите читать о коллекциях, но, очевидно, бинарный поиск не работает в связанном списке. Какие алгоритмы вам нужны? Эффективные алгоритмы сортировки уже существуют. Linq и .NET коллекции должны предоставить вам все, что вам нужно.

+0

Нет, он специально хочет алгоритмы IList, и два примера, которые он дает, могут быть реализованы для IList в BCL, но в настоящее время нет. Они привязаны к списку и массиву. –

0

Я также попал в эту проблему. Мое решение состояло в том, чтобы использовать Reflector, чтобы узнать о реализации List.Sort и Array.BinarySearch и переписать их как методы расширения для IList<T>.

Даже если вы не пишете их как расширения, а как обычные статические методы (например,если вы используете C# 2), вам не нужен ваш точный синтаксис:

Algorithms<T>.Sort(items); 

Просто сделайте Sort статический универсальный метод, в обычный статический (не общий) класса Algorithms, и определение типа будет делать остальные, глядя на тип аргумента:

Algorithms.Sort(items); 
+0

Проверьте мой собственный ответ. – mark

1

Вы можете использовать эту библиотеку в качестве шаблона: Generic Sorting Library

Это все еще в стадии разработки и не содержит все алгоритмы сортировки. Однако вы можете использовать его в качестве шаблона и основываться на нем.

Он предоставляет метод sort() как метод расширения над IList и требует указания алгоритма сортировки и сравнения. поэтому ваш код может быть записан следующим образом:

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

Сообщите мне, если это поможет.

Смежные вопросы