2017-01-15 14 views
4

私は抽象クラスを持っている、のはフルーツを呼び出してみましょう。戻る2種類

果実から派生する2つのクラスがあり、のは、Appleや梨、それらを呼びましょう。

私は彼らの有効期限、のは言わせて、によってリンゴと梨の両方を返す必要がある機能を持っています。

それは、このようなものになります。私は2つの結果を返すにはどうすればよい

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(); 

同様にUnionConcatの代わりに動作しますが、あなたはおそらく2種類を比較し、それらをデデュープを心配する必要はありません。私はそれがリンゴを梨と比較するのは良いことではないと聞いています(ああ待って、それはオレンジです)。

は、この名前空間を必ず含めてください:あなたは、このメソッドを呼び出すと、あなたが戻っサブクラスのメンバーに取得する必要がある場合

using System.Linq; 

、その後、あなたは、各項目で安全なキャストを行う必要があり、または別ますタイプは、たとえば.OfType<Apple>()を呼び出して戻します。

+0

これはプロパティとフィールドをそのまま保持しますか? – master2080

+1

はい、それは=)downvoterに:私は何を変更したいですか? – Stuart

+2

私は投票しませんでしたが、 'Union'は暗黙のDistinctを実行するので、重複を失う可能性があります。 '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 []型であり、第二は、梨[]型です。彼らは両方ともフルーツから派生したものです。申し訳ありませんが十分に明確でない場合。 – master2080

+1

次に、コード例が機能するはずです。私は実際に配列を返すLinqは知っていませんが、それは問題ありません。上記のコードを試してください。それはよりクリーンで、常にベースクラスにキャストされません。 – Peter4499

+0

ToArray()でLinqの結果をキャストすると配列が返されますが、これよりも優れた例はありませんでしたが、答えが必要でした。 – master2080