Почему List <T>не реализует IOrderedEnumerable <T>? - PullRequest
11 голосов
/ 25 марта 2011

Я хотел бы работать с упорядоченными перечислимыми и использовать интерфейсы в качестве возвращаемых типов, а не конкретные типы. Мне нужно вернуть упорядоченный набор объектов. Но при использовании IList<T> реализации я не могу вернуть IOrderedEnumerable<T>, так как IList<T> не наследует IOrderedEnumerable<T>.

В приведенном ниже примере у меня есть модель представления с хранилищем рядов, реализованным в виде List<T> объектов рядов, которые, как они находятся в List<T>, упорядочены. В качестве метода доступа я хочу вернуть отфильтрованный набор рядов, в который возвращаются только объекты серии определенного типа, сохраняя при этом исходный порядок среди фильтруемых элементов.

/// <summary>
/// Represents the view model for this module.
/// </summary>
public class ViewModel : AbstractViewModel
{
    /// <summary>
    /// Gets the series repository.
    /// </summary>
    /// <value>The series repository.</value>
    public IList<ISeries> SeriesRepository { get; private set; }

    //...
}

//8<-----------------------------

    /// <summary>
    /// Gets the series of the specified type.
    /// </summary>
    public IOrderedEnumerable<T> Series<T>() where T : ISeries
    {
        return ViewModel.SeriesRepository.OfType<T>(); //compiler ERROR
    }

Компилятор говорит мне:

Error   14  Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<T>' to 'System.Linq.IOrderedEnumerable<T>'. An explicit conversion exists (are you missing a cast?) ...

Как я могу поддержать такой сценарий? И почему List не реализует IOrderedEnumerable?

РЕДАКТИРОВАТЬ : Чтобы уточнить мои намерения: я просто хочу заявить на уровне интерфейса, что мой репозиторий имеет порядок, даже если он явно не указан ключом. Так, .ThenBy и др. Не следует добавлять новый заказ, так как уже есть один - мой единственный и только один. :-). Я вижу, что вот так, я скучаю по намерению .ThenBy.

Ответы [ 2 ]

15 голосов
/ 25 марта 2011

Как может List<T> реализовать IOrderedEnumerable<T>? Это должно было бы обеспечить способ создания последующего заказа ... что это вообще значит?

Учтите это:

var names = new List<string> { "Jon", "Holly", "Tom", "Robin", "William" };
var ordered = names.ThenBy(x => x.Length);

что это вообще значит? Нет первичного порядка сортировки (как было бы, если бы я использовал names.OrderBy(x => x)), поэтому невозможно навязать вторичный порядок сортировки.

Я предлагаю вам попробовать создать собственную реализацию IOrderedEnumerable<T> на основе List<T> - поскольку вы пытаетесь реализовать метод CreateOrderedEnumerable, я думаю, вы поймете, почему это неуместно. Вы можете найти мой пост Edulinq в IOrderedEnumerable<T> полезным.

10 голосов
/ 25 марта 2011

Ну, вы не правы: List<T> - это НЕ , заказанный определенным ключом. Элементы внутри списка расположены в том порядке, в котором вы их поместили. Именно поэтому List<T> не реализует IOrderedEnumerable<T>.
Просто верните следующее:

ViewModel.SeriesRepository.OfType<T>().OrderBy(<your order predicate>);
...