I希望使用有序枚举,并使用接口作为返回类型而不是具体类型。需要返回一组有序的对象。但是,当使用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 et.al.不应该增加一个新的秩序,因为已经有一个-我自己的一个,也只有一个。-)。我明白了,就像这样,我想念.ThenBy的意图。
发布于 2011-03-25 08:20:57
List<T>如何实现IOrderedEnumerable<T>?它必须提供一种方法来创建一个后续的订单..。这到底是什么意思?
考虑到这一点:
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很有用。
发布于 2011-03-25 08:17:20
好吧,你错了:List<T>是,而不是,是按特定键排序的。列表中的元素按照放置它们的顺序排列。这就是为什么List<T>不实现IOrderedEnumerable<T>的原因。
只需返回以下内容:
ViewModel.SeriesRepository.OfType<T>().OrderBy(<your order predicate>);https://stackoverflow.com/questions/5429974
复制相似问题