3

という基本クラスがありますFruits。次に、その子クラスがいくつかあります。たとえば、、、Banana:FruitなどApple:Fruitです。

次に、バナナ、アップルなど、さまざまなタイプのオブジェクトのリストを取得します。それは次のようになります。

List<Fruits> f = new List<Fruits>{new Banana(), new Banana(), new Apple(), new Banana()};

タイプだけでなく果物のリストを取得できる関数が必要で、リストにそのタイプのオブジェクトのみを含むリストを提供します。したがってfind_obj(f, Banana)、 , (または何か) を呼び出すと、バナナのみを含むリストが返されます。

ここで極度の無知を示​​している可能性があり、申し訳ありません。これは可能ですか?クラスを事前に知っていれば、次のようなことができることはわかっています。

public List<Fruit> GimmeBanana(List<Fruit> f)
{
     List<Fruit> Output=new List<Fruit>{ };
     foreach(Fruit fr in f)
     {
         if (fr is Banana){ Output.Add(fr); }
     }
}

しかし、それをAnyクラスで機能させる方法がわかりません。

4

4 に答える 4

14

そのようなメソッドはすでにフレームワークに存在します- OfType<T>

List<Banana> bananas = f.OfType<Banana>().ToList();
于 2012-05-05T16:20:27.873 に答える
2

次のような一般的なメソッドが必要です。

    public List<T> GimmeAnyOfType<T>(List<Fruit> f)
    {
        return f.OfType<T>().ToList();
    } 
于 2012-05-05T16:26:16.987 に答える
1

他の回答で指摘されているように、学習経験として使用する必要がありますがOfType、これが私があなたのメソッドを書く方法です:

public IEnumerable<Banana> GimmeBananas(List<Fruit> f)
{
     if (f == null) yield break; //depending on what business logic you're looking for.
     foreach(Fruit fr in f)
     {
         if (fr is Banana) yield return fr;
     }
}
于 2012-05-05T16:22:16.067 に答える
0

LINQ OfType 演算子を使用して、型が一致する要素のみをコレクションから選択できます。

class Fruit { }
class Banana : Fruit{}
class Apple : Fruit{}

static void Main(string[] args)
{
    var fruits = new List<Fruit> { new Banana(),  new Banana(), new Apple(), new Fruit() };
    int bananas = fruits.OfType<Banana>().Count(); // 2
    int apples = fruits.OfType<Apple>().Count(); // 1
    int fruitc = fruits.OfType<Fruit>().Count(); // 4
    int exactFruits = GetOfExactType<Fruit,Fruit>(fruits).Count();  // 1
}


static IEnumerable<V> GetOfExactType<T, V>(IEnumerable<T> coll)
{
    foreach (var x in coll)
    {
        if (x.GetType().TypeHandle.Value == typeof(V).TypeHandle.Value)
        {
            yield return (V)(object)x;
        }
    }
}

この演算子は、派生階層がフラットな場合にのみ機能します。たとえば、果物から派生した基本クラスとしてリンゴがあり、GoldenDelicius、RedDelicus などの特殊化されたリンゴがあり、リンゴ型であるが派生したものではないすべてのリンゴをカウントしたい場合、OfType 演算子ではそれを行うことができません。このためには、追加の関数が必要です。この例では、GetOfExactType と呼ばれています。

于 2012-05-05T16:25:09.823 に答える