2017-05-16 1 views
0

多くの異なる実装を格納するインタフェースのコレクションを定義しました。次に、これらの実装のうちの1つのサブセットのみを取得する必要があります。そして、私は、このサブセットに実装タイプ(インタフェースではない)をタイプすることで必要です。リストでサブセットをタイプ別に選択するには、これとは別の方法があります

私はそうする方法はたくさんあると思いますが、どちらが効率的かは不思議です。それを言って、私はefficientが多くの意味(複雑さ、メモリ/ CPUの食べる、など)を取ることができることを認識しています。

他の言い方をすれば、これらの操作をどのように実行するのか教えていただけますか?

var myList = new List<IFoo>(); 

これは私が考えた最初のものです:

var mySubSet = myList.Where(f => f is FooImpl).Cast<FooImpl>(); 

しかし、私はそれを入力したとき、私は考えた:「これは、二回悪い考えをキャストを行います」。私が間違っている ?

だから私は考えた:

var mySubSet = myList.Select(f => f as FooImpl1).Where(f => f != null); 

そしてもちろん、マニュアルループと、昔ながらの方法があります:

var mySubSet = new List<FooImpl1>(); 
foreach(var foo in myList) 
{ 
    var fooImpl1 = foo as FooImpl1; 
    if(fooImpl1 != null) 
    { 
     mySubSet.Add(fooImpl1); 
    } 
} 

おそらくこれを行うには、他の方法はたくさんありますが、私の質問を改善することを躊躇しないでください。

+0

「OfType」[msdn](https://msdn.microsoft.com/en-us/library/bb360913(v=vs.110).aspx)を使用 –

+0

正確な重複はしませんが、強く関連している可能性があります。http ://stackoverflow.com/questions/686412/c-sharp-is-operator-performance –

答えて

3
var mySubSet = myList.Where(f => f is FooImpl).Cast<FooImpl>(); 

しかし、私はそれを入力して、私は考えた:「これは二回のキャストを行います、悪い アイデア」。私が間違っている ?

キャストは2回行われませんが、とにかく最善の方法ではありません。

var mySubSet = myList.OfType<FooImpl>().ToList(); 

これは本当に、より効率的ではなく(また、作業効率を意味することができた)より読みやすくはない:

あなたはフィルタリングし、同時にキャストEnumerable.OfTypeを使用することができます。

関連する問題