为什么List <t>没有实现IOrderedEnumerable <t>?</t> </t>

时间:2011-03-25 08:12:38

标签: c# types ienumerable where ilist

我想使用有序的枚举,并使用接口作为返回类型而不是具体类型。我需要返回一组有序的对象。但是,当使用IList<T>实施时,我无法返回IOrderedEnumerable<T>,因为IList<T>不会继承IOrderedEnumerable<T>

在下面的示例中,我有一个带有系列存储库的视图模型,实现为系列对象的List<T>,因为它们位于{{1有序的。我是一个访问器方法,我想返回一个系列的过滤集,其中只返回特定类型的系列对象,同时保持过滤元素中的原始顺序。

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
    }

我如何支持这种情况?为什么List没有实现IOrderedEnumerable?

编辑:澄清我的意图:我只是想在接口级别声明我的存储库有一个订单,即使它没有由一个键明确指定。 因此,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?) ... 等。不应该添加新订单,因为已经存在一个 - 我自己的一个且只有一个。 :-)。我知道,就像这样,我想念.ThenBy的意图。

2 个答案:

答案 0 :(得分:15)

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 blog post on IOrderedEnumerable<T>很有用。

答案 1 :(得分:10)

嗯,你错了:List<T> NOT 按特定键排序。列表中的元素按照您放入的顺序排列。这就是为什么List<T>未实现IOrderedEnumerable<T>的原因。 只需返回以下内容:

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