2011-06-15 161 views
1

所以我有一个对象继承了一个列表。Linq排序依据为

public class Foo: List<Bar> 

而且我想通过BarDate重新安排它这是对Bar

属性例如

Foo testFoo = GetFoo(); 

testFoo = testFoo.OrderBy(b => b.BarDate).ToList(); 

testFooFoo类型不List的我怎么可能做演员?

谢谢

+1

我只是跑这个代码,它工作正常。它不应该是一个问题,因为'Foo'实现'IEnumerable'和'IEnumerable '。你收到什么错误信息? – aligray 2011-06-15 11:34:53

+1

它的工作原理?我得到一个编译器错误:不能隐式地将类型'System.Collections.Generic.List '转换为'ConsoleApplication1.Foo'。存在明确的转换(您是否缺少演员?) – 2011-06-15 11:42:53

回答

4

你不能那样做。你正在设置一个派生类的引用,它的基础实例将不起作用。

testFoo只能是FooFoo派生的对象的引用(List<Bar>是一个基类的Foo

你可以,但是,做这样的事情:

public class Foo : List<Bar> 
{ 
    public Foo() 
    {} 

    public Foo(IEnumerable<Bar> collection) 
     : base(collection) 
    {} 
} 

而且在您的代码稍后:

Foo testFoo = new Foo(); 
testFoo = new Foo(testFoo.OrderBy(b => b.BarDate)); 

LINQ表达式wi会返回一个IEnumerable<Bar>,所以是List<T>

顺便说一句,编译器错误消息说的原因“的显式转换存在(是否缺少强制转换?)”的建设者之一兼容是因为如果你有一个对象,真的是一个Foo碰巧被引用为List<Bar>然后你可以施放它。例如

Foo myFoo = new Foo(); 
List<Bar> myList = myFoo; 
Foo sameFoo = (Foo)myList; 

所有这三个引用(myFoomyListsameFoo)所有参考完全相同的Foo实例和铸造会工作。但是,如果是这样的情景:

List<Bar> actualList = new List<Bar>(); 
Foo listedFoo = (Foo)actualList; 

然后投将失败,因为actualList不是FooFoo衍生物。

0

ToList()返回新的List<Bar>。没有办法得到一个Foo对象。 这是您不应该从List继承的原因之一。

+1

我不太确定这是“您不应该从列表继承的原因之一”。从列表继承可能有很多很好的理由,包括添加不在列表中的其他功能。但是如果你想让你的Foo对象返回(你永远不会得到它,因为如果你坚持使用List,你永远不会得到你的原始List,只有一个新的List),那么就不要失去对它的引用。 – 2011-06-15 11:47:45

+0

列表没有虚拟方法来覆盖,所以这是没有用的。如果你添加了新的字段,它们就像海报那样是失落的,因为LINQ不会返回你的旧List对象,只返回它的元素。 – codymanix 2011-06-15 12:05:52

+0

在这种情况下,它对于我继承列表非常有用,但我明白了你的观点 – 2011-06-24 15:41:19