2011-02-09 76 views

回答

5

在.NET 4 BCL中添加了同向和反向變量,並且不存在於.NET 3.5 BCL中。

可以解決此限制在3.5使用Select操作投放到接口類型:

IQueryable<Foo> foos = ..; 
myFunc(foos.Select(x => (IFoo)x)); 

編輯(從裏德的評論,下同):

IQueryable<Foo> foos = ..; 
myFunc(foos.Cast<IFoo>()); 
+0

看到更新的問題,我有IQueryable的 – leora 2011-02-09 02:12:51

+0

@ooo - 看到更新的答案。 – 2011-02-09 02:14:14

+3

+1:我推薦使用`foo.Cast ()`代替,雖然:http://msdn.microsoft.com/en-us/library/bb301460.aspx – 2011-02-09 02:20:23

1

的原因是因爲List<Foo>是一個新的類正在生成,所以是List<IFoo> ...所以,編譯器與他們完成時,他們現在將是2全新的在你的項目中找到獨特的類。

編輯:一排序的解決方案:

你可以做的是這樣的:

var myIFooList = myFooList.Select(item => (IFoo)item).ToList(); 
2

除了由Stephen Cleary答案,你也可以使用OfType表達:

IQueryable<Foo> foos = GetFoos(); 
var ifoos = foos.OfType<IFoo>(); 

我想象的OfType方法可能會快一點,因爲表達式是過濾集合按類型而不是鑄造。

Anthony Pegram在評論中提出了一個很好的觀察/觀點。下面是OfType<>在100萬個項目集合的快速測試VS Cast<>

OfType Test 
00:00:00.1034880 
00:00:00.0966734 
00:00:00.0969874 
00:00:00.1318617 
00:00:00.0984404 
00:00:00.0970098 
00:00:00.0981691 
00:00:00.0972425 
00:00:00.1330730 
00:00:00.1239663 
total: 00:00:01.0769116 
    avg: 00:00:00.1076911 

Cast Test 
00:00:00.0556266 
00:00:00.0729768 
00:00:00.0512704 
00:00:00.0519060 
00:00:00.0533288 
00:00:00.0752939 
00:00:00.0754975 
00:00:00.0821554 
00:00:00.0536814 
00:00:00.0754732 
total: 00:00:00.6472100 
    avg: 00:00:00.0647210 
相關問題