首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么List<T>不实现IOrderedEnumerable<T>?

为什么List<T>不实现IOrderedEnumerable<T>?
EN

Stack Overflow用户
提问于 2011-03-25 08:12:38
回答 2查看 9.8K关注 0票数 13

I希望使用有序枚举,并使用接口作为返回类型而不是具体类型。需要返回一组有序的对象。但是,当使用IOrderedEnumerable<T>**,实现时,我不能返回,因为** IList<T> 不继承 IOrderedEnumerable<T>.

在下面的示例中,我有一个包含系列化存储库的视图模型,该模型被实现为串联对象的List<T>,这些对象是有序的,因为它们驻留在List<T>中。我是一个访问器方法,我想返回一个经过过滤的系列集合,其中只返回特定类型的系列对象,同时保持过滤元素之间的原始顺序。

代码语言:javascript
复制
/// <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
    }

编译器告诉我:

代码语言:javascript
复制
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 et.al.不应该增加一个新的秩序,因为已经有一个-我自己的一个,也只有一个。-)。我明白了,就像这样,我想念.ThenBy的意图。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-25 08:20:57

List<T>如何实现IOrderedEnumerable<T>?它必须提供一种方法来创建一个后续的订单..。这到底是什么意思?

考虑到这一点:

代码语言:javascript
复制
var names = new List<string> { "Jon", "Holly", "Ash", "Robin", "William" };
var ordered = names.ThenBy(x => x.Length);

这到底是什么意思?没有主排序顺序(就像我使用names.OrderBy(x => x)时那样),所以不可能强制执行二级排序顺序。

我建议您尝试基于一个IOrderedEnumerable<T>创建自己的List<T>实现--当您尝试实现CreateOrderedEnumerable方法时,我想您会明白为什么它是不合适的。您可能会发现我的Edulinq blog post on IOrderedEnumerable很有用。

票数 17
EN

Stack Overflow用户

发布于 2011-03-25 08:17:20

好吧,你错了:List<T>,而不是,是按特定键排序的。列表中的元素按照放置它们的顺序排列。这就是为什么List<T>不实现IOrderedEnumerable<T>的原因。

只需返回以下内容:

代码语言:javascript
复制
ViewModel.SeriesRepository.OfType<T>().OrderBy(<your order predicate>);
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5429974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档