2017-10-10 13 views
1

クラスでは、IInterfaceのリストを処理します。同じインターフェイスを実装するクラスの2つのリストをマージする

私はそれ故、別の方法で処理される2つの可能な実装をしたい:

public List<IInterface> Process(List<IInterface> InterfaceList) 
{ 
    List<FirstImplementation> FirstList = FirstProcess(InterfaceList.OfType<FirstImplementation>.ToList()); 

    List<SecondImplementation> SecondList = SecondProcess(InterfaceList.OfType<SecondImplementation>.ToList()); 

    return new List<IInterface> { 
    FirstList, 
    SecondList 
}; 

} 

Iは、List<IInterface>を返すしたい入力と同様、両方それは予想以上に困難であることが判明したことになります

return new List<IInterface> { 
    FirstList, 
    SecondList 
}; 

コンパイルが、実行時にInvalidCastExceptionがスローされます、

return new List<IInterface>.AddRange(FirstList).AddRange(SecondList); 

はコンパイルされません。

これを行う正しい方法は何でしょうか? LINQの使用

+0

最後の例はほぼ正しいです。それは括弧がなく、 'AddRange'は戻り値の型が' void'なので、連鎖することはできません: 'var ret = new List (); ret.AddRange(FirstList); ret.AddRange(SecondList); return ret;; –

答えて

7

return FirstList.Cast<IInterface>().Concat(SecondList.Cast<IInterface>()).ToList(); 

Cast<>は、ターゲット型にキャスト要素を列挙(心のLINQの遅延実行を)返しConcatは2 enumerablesを組み合わせ、ToListはリストに結果をオン(およびLINQクエリを具体化)。

@Evkが親切に気付いたように、両方の型から出力型への暗黙のキャストがある場合(あなたの場合のように両方の型を共通のインターフェイスにキャストできます)、キャストを完全にスキップできますその場合、連結のタイプを明示的に指定する必要があります)。

return FirstList.Concat<IInterface>(SecondList).ToList(); 
+1

2回目に '.Cast 'は必要ありません。 –

+1

キャストはまったく必要ありません。 'FirstList.Concat (SecondList).ToList();' – Evk

+0

を修正してください。これは、暗黙のキャストがなかったより一般的な例で書いています。 – decPL

関連する問題