我想使用有序的枚举,并使用接口作为返回类型而不是具体类型。我需要返回一组有序的对象。但是,当使用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
的意图。
答案 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>);