0

私は本から C# を学んでおり、構文をよりよく理解するために例を拡張しています。

次のコードを使用して、オブジェクトのコレクションを循環させ、特定のものだけを選択して、それらを別の配列にロードできるようにしようとしています。私は今、この特定の行に苦労しています:

if (animalCollection[i].Equals(Chicken))

Program.cs の完全なコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11Ex02
{
class Program
    {
    static void Main(string[] args)
        {
        Animals animalCollection = new Animals();
        animalCollection.Add(new Cow("Jack"));
        animalCollection.Add(new Chicken("Vera"));
        animalCollection.Add(new Chicken("Sally"));

        Animal[] birds = new Animal[2];
        for (int i = 0; i < animalCollection.Count; i++)
            {
            if (animalCollection[i].Equals(Chicken))
                birds[i] = animalCollection[i];
            }

        foreach (Animal myAnimal in animalCollection)
            {
            myAnimal.Feed();
            }
        Console.ReadKey();
        }
    }
}

私の目標は、オブジェクト タイプ Chicken のみを、birds という新しい配列にロードすることです。

以下は、動物クラスのコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11Ex02
{
public abstract class Animal
    {
    protected string name;

    public string Name
        {
        get
            {
            return name;
            }
        set
            {
            name = value;
            }
        }

    public Animal()
        {
        name = "The animal with no name";
        }

    public Animal(string newName)
        {
        name = newName;
        }

    public void Feed()
        {
        Console.WriteLine("{0} has been fed." , name);
        }

    internal bool equals()
        {
        throw new NotImplementedException();
        }
    }
}

これがクラス Chicken のコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11Ex02
{
public class Chicken : Animal
    {
    public void LayEgg()
        {
        Console.WriteLine("{0} has laid an egg." , name);
        }
    public Chicken(string newName): base(newName)
        {
        }
    }
}

ここに動物クラスのコードがあります:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11Ex02
{
public class Animals : CollectionBase
    {
    public void Add(Animal newAnimal)
        {
        List.Add(newAnimal);
        }

    public void Remove(Animal newAnimal)
        {
        List.Remove(newAnimal);
        }

    public Animals()
        {
        }

    public Animal this[int animalIndex]
        {
        get
            {
            return (Animal)List[animalIndex];
            }
        set
            {
            List[animalIndex] = value;
            }
        }
    }
}
4

3 に答える 3

5

基礎

オブジェクトが特定のタイプであるかどうかを判断するには、typeofまたはを使用できます。is

if (typeof(someObject) == typeof(Chicken))

また

 if (someObject is Chicken)

特にあなたの場合

if (animalCollection[i].Equals(Chicken))

になる

if (typeof(animalCollection[i]) == typeof(Chicken))

また

if (animalCollection[i] is Chicken)

このようにオブジェクトのタイプを決定することもできます

Type t = animalCollection[i].GetType();

ファーストウェイ

これが基本レベルでどのように機能するかを説明したので、Linq を使用して 1 行で同じことを達成する方法を次に示します。

var chickens = animals.OfType<Chicken>().ToArray();

ところで

タイプ名を文字列として取得したい場合は、これを行うことができます

string typeName = t.FullName;
于 2012-07-11T16:13:17.210 に答える
2

Linqは1つのステートメントでこれを行うことができます

var birds=animals.OfType<Chicken>().ToArray();
于 2012-07-11T16:15:18.273 に答える
1

演算子isまたはtypeof

 if (animalCollection[i] is Chicken)
            birds[i] = animalCollection[i];

またtypeof

 if (typeof(animalCollection[i]) == typeof(Chicken))
            birds[i] = animalCollection[i];
于 2012-07-11T16:15:25.063 に答える