2

我的项目中有以下课程。

[Serializable]
public class BaseEntityCollection<T> : List<T> where T : BaseEntity, new()
{

    protected BaseEntityCollection()
    {
    }

}

[Serializable]
public abstract class BaseEntity
{
    protected BaseEntity()
    {
    }
}


public class MyClassCollection : BaseEntityCollection<MyClass>
{
}

问题领域

MyClassCollection objList = 
MyClassName.MyFunctionName().OrderByDescending(i => i.MyPropertyName);

此行给出编译错误。

Cannot implicitly convert type System.LinQ.IOrderedEnumerable<MyClass>
to MyClassCollection. An implicit conversion exists(are you missing a
cast?)

编辑

我无权更改架构设计。

4

3 回答 3

5

目前尚不清楚为什么您希望它起作用,但您可以使用:

MyClassCollection objList = new MyClassCollection();
objList.AddRange(MyClassName.MyFunctionName()
                            .OrderByDescending(i => i.MyPropertyName));

就我个人而言,我不喜欢一开始就派生新List<T>的集合,也不喜欢从泛型类派生非泛型类只是为了固定类型参数,但如果这是你必须接受的架构......

于 2012-04-23T14:31:23.407 回答
1
var orderedItems = MyClassName.MyFunctionName().OrderByDescending(i => i.MyPropertyName);
MyClassCollection objList = new MyClassCollection(orderedItems);

添加时表达式的结果OrderByDescending是实现的框架类,IOrderedEnumerable<T>不能隐式转换为MyClassCollection. 您可以添加一个隐式转换,或者只是将 any 传递IEnumerable<T>给您将从 继承的构造函数List<T>,如上所示。

于 2012-04-23T14:23:50.920 回答
0

你想创建新的集合,还是对返回的集合进行排序?如果是以后,那么通常忘记OrderByDescending和 LINQ 并使用List.Sort代替。

问题是调用 OrderByDescending 将创建新的内部 LINQ 对象,该对象实现IOrderedEnumerable. 然后,您将需要创建一些真正的集合,例如Listor Array

要解决您的问题,您应该像这样覆盖 IEnumerable construrcor BaseEntityCollection<t>

public BaseEntityCollection(IEnumerable<T> items):base(items)
{
}

并称它为:

  MyClassCollection objList = new MyClassCollection(MyClassName.MyFunctionName().OrderByDescending(i => i.MyPropertyName));

但我真的会质疑你的整个设计。在开始使用它之前,您应该阅读更多关于 LINQ 的信息,因为您尝试使用它的方式是错误的。

于 2012-04-23T14:30:47.050 回答