2017-01-15 89 views
4

我有一個抽象類,我們稱之爲Fruit。返回派生自同一抽象類的兩種類型

有兩個類來源於水果,我們稱它們爲Apple和Pear。

我有一個函數需要返回蘋果和梨,比方說,它們的失效日期。

它看起來是這樣的:

public Fruit[] GetFruitByDate(string date){ 
Apple[] apples=/*Linq result*/; 
Pear[] pears=/*Linq result*/; 
return apples+pears;//what do I do here? 
} 

如何返回兩個結果?

謝謝。

+2

'返回apples.Cast ().Concat(pears.Cast ())ToArray的();' – haim770

+0

是的,他們有不同的成員,它只是一個壞榜樣。 – master2080

+1

你確定要在Linq世界中使用這些'[]'嗎? –

回答

4

你可以這樣做:

return apples.Cast<Fruit>().Concat(pears).ToArray(); 

同樣Union會工作,而不是Concat,但你也許並不需要擔心比較兩種類型和去欺騙他們。我聽說把蘋果和梨比較是不好的(哦,等等,那是橙子)。

一定要包括這個命名空間:

using System.Linq; 

當調用此方法,如果你需要找回的子類的成員,那麼你需要做的每一項安全投,或獨立例如通過呼叫.OfType<Apple>()返回類型。

+0

這保留了它們的屬性和字段,對吧? – master2080

+1

是的,它=)對於downvoter:你想要我改變什麼? – Stuart

+2

我沒有投票,但'聯合'確實是一個明顯的差異,所以你可能會失去重複。 'Concat'會更好。此外,@ master2080雖然屬性和字段不會「丟失」,但是您將會對「Fruit」進行引用,因此您只能直接訪問其屬性/字段,而無需投射到適當的子類「Apple」或「Pear '要做到這一點,你必須知道具體項目的類型(可能通過使用'is'檢查或'as' +'!= null'檢查) – pinkfloydx33

5

如果你不得不繼續鑄造東西,那麼你做錯了什麼,或者對繼承沒有清楚的理解。因爲Linq可以返回不同的類型,所以在=之後不會給出正確的答案,所以在var之後提出一個問題並且沒有真正的代碼。我只是假設它返回並且IEnnumarble某種。

public Fruit[] GetFruitByDate(string date){ 
List<Fruit> tResult = new List<Fruit>(); 
var apples=/*Linq result*/; 
var pears=/*Linq result*/; 
tResult.AddRange(apples); 
tResult.AddRange(pears); 
return tResult.ToArray(); 
} 
+0

Linq確實返回不同的類型,第一個結果是Apple []類型,第二個是Pear []類型。它們都來源於水果。很抱歉,如果它不夠清楚。 – master2080

+1

然後代碼示例應該可以工作。我實際上並不知道任何返回數組的Linq,但沒關係。試試上面的代碼。它更乾淨,並且不會經常投射到基礎級別。 – Peter4499

+0

使用ToArray()投射Linq結果會返回一個數組,我只是沒有比這更好的例子,但需要一個答案。 – master2080