オブジェクトのリストがあり、Typeの配列である入力パラメーターに従っていくつかの要素を抽出するメソッドを作成する必要があります。関数は、リストから要素の配列を返す必要があります。各要素は、型の配列からの1つの要素のインスタンスです。同時に、これらの要素はコンテナリストから削除する必要がありますが、それらがすべてリストに存在する場合に限ります。タイプ比較はType.IsInstanceOfType(o)
メソッドによって行われます。
class A {}
class B : A {}
class C : A {}
class D : A {}
public static A[] ExtractElements (List<A> list, Type[] specifiers) {...}
Type[] specifiers1 = new Type[2] {typeof(D), typeof(B)};
Type[] specifiers2 = new Type[3] {typeof(C), typeof(A), typeof(D)};
Type[] specifiers3 = new Type[2] {typeof(A), typeof(A)};
Type[] specifiers4 = new Type[2] {typeof(C), typeof(C)};
List<A> list = new List<A> {new B(), new A(), new D(), new C(), new A()};
A[] result1 = ExtractElements (list, specifiers1);
list = new List<A> {new B(), new A(), new D(), new C(), new A()};
A[] result2 = ExtractElements (list, specifiers2);
list = new List<A> {new B(), new A(), new D(), new C(), new A()};
A[] result3 = ExtractElements (list, specifiers3);
list = new List<A> {new B(), new A(), new D(), new C(), new A()};
A[] result4 = ExtractElements (list, specifiers4);
このコードフラグメントの結果は次のようになります。
result1 is {D, B}, list is {A, C, A}
result2 is {C, B, D}, list is {A, A}
result3 is {B, A}, list is {D, C, A}
result4 is empty array, list is {B, A, D, C, A}
別の努力として、リスト内の順序が次のような型入力配列内の要素の順序に対応する要求された型のアイテムがリストに含まれている場合にのみ、空でない配列を返す同様のExtractElementsメソッドを作成することが可能です。
Type[] specifiers5 = new Type[2] {typeof(B), typeof(D)};
Type[] specifiers6 = new Type[2] {typeof(C), typeof(B)};
List<A> list = new List<A> {new B(), new A(), new D(), new C(), new A()};
A[] result5 = ExtractElements (list, specifiers5);
list = new List<A> {new B(), new A(), new D(), new C(), new A()};
A[] result6 = ExtractElements (list, specifiers6);
このコードフラグメントの結果は次のようになります。
result5 is {B, D}, list is {A, C, A}
result6 is empty array, list is {B, A, D, C, A}
私はそれLINQ
がこれを実装する方法であることを知っていますが、残念ながら私はそれを使った経験がありません。