Я хочу реализовать несколько различных алгоритмов для практики, просто чтобы увидеть, насколько я плох на самом деле, и стать лучше :p
В любом случае, я подумал, что попробую использовать IEnumerable<T>
и IOrderedEnumerable<T>
и другие типы коллекций .Net просто для совместимости (чтобы то, что я пишу, можно было легче использовать позже).
Но я не могу найти способ вернуть экземпляр IOrderedEnumerable<T>
, кроме как с помощью методов расширения OrderBy и ThenBy. Поэтому я думаю, мне нужно создать свой собственный класс, реализующий этот интерфейс. Но интерфейс мне не совсем понятен, если честно. Может быть, но я не уверен.
Я создал пустой класс, добавил интерфейс, а затем попросил ReSharper добавить для меня пустые реализации. Это выглядит так:
class MyOrderedEnumerable<T> : IOrderedEnumerable<T>
{
/// <summary>
/// Performs a subsequent ordering on the elements of an <see cref="T:System.Linq.IOrderedEnumerable`1"/> according to a key.
/// </summary>
/// <returns>
/// An <see cref="T:System.Linq.IOrderedEnumerable`1"/> whose elements are sorted according to a key.
/// </returns>
/// <param name="keySelector">The <see cref="T:System.Func`2"/> used to extract the key for each element.</param><param name="comparer">The <see cref="T:System.Collections.Generic.IComparer`1"/> used to compare keys for placement in the returned sequence.</param><param name="descending">true to sort the elements in descending order; false to sort the elements in ascending order.</param><typeparam name="TKey">The type of the key produced by <paramref name="keySelector"/>.</typeparam><filterpriority>2</filterpriority>
public IOrderedEnumerable<T> CreateOrderedEnumerable<TKey>(Func<T, TKey> keySelector, IComparer<TKey> comparer, bool descending)
{
throw new NotImplementedException();
}
/// <summary>
/// Returns an enumerator that iterates through the collection.
/// </summary>
/// <returns>
/// A <see cref="T:System.Collections.Generic.IEnumerator`1"/> that can be used to iterate through the collection.
/// </returns>
/// <filterpriority>1</filterpriority>
public IEnumerator<T> GetEnumerator()
{
throw new NotImplementedException();
}
/// <summary>
/// Returns an enumerator that iterates through a collection.
/// </summary>
/// <returns>
/// An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
/// </returns>
/// <filterpriority>2</filterpriority>
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Чего я не понимаю, так это метода CreateOrderedEnumerable
. Что именно он должен делать? Ну, я думаю, это, конечно, создаст упорядоченное перечисление, но как? Должен ли сам алгоритм сортировки идти туда? И что он будет сортировать? В этот метод не входит коллекция элементов, так где же он должен упорядочить коллекцию? Как бы вы использовали класс? Предназначен ли он для реализации, например, как частный вспомогательный класс внутри чего-то, что нужно сортировать?
Тогда вместо MyOrderedEnumerable<T> : IOrderedEnumerable<T>
у вас может быть QuickSorter<T> : IOrderedEnumerable<T>
, который берет коллекцию в своем конструкторе и сортирует ее при вызове этого метода CreateOrderedEnumerable
... но что произойдет, если кто-то вызовет GetEnumerator
и начнет перечислять до вызова этого метода?
Ха-ха, только что обнаружил, что некоторое время назад я задавал нечто подобное здесь. Но это было примерно так, если бы можно было вернуть один. Так что я думаю, что этот вопрос является ответом на единственный ответ, который я там получил =)