0

助けが必要な 2 つの問題があります。

最初の問題は、ファイルからインポートしたリストに文字列を表示することです。名前を表示する代わりに、名前空間の名前 + クラス ex の名前を取得します。inupp_v9.boy. 文字列を上書きしようとしましたToStringが、その後リストに何も表示されません。

2 番目に助けが必要なのは、Personクラスのコンストラクターで引数として性別を使用する必要があることと、性別に列挙型を使用するのが適切であることです。しかし、問題は、それを何に、どのように使用するかがまったくわからないことです。誰かが私が使用できるアイデアを思いつくことができれば、それをどのように使用するかは素晴らしいことです.

たとえば、新しい名前を作成するときに、2 つのラジオボタンのどちらをチェックするかに応じて、名前が男性または女性に設定される性別を使用することを考えています。次に、名前を または のいずれかにエクスポートしgirltxt.fileますboytxt.file

しかし、私はそれを行う方法がわからないので、私が使用できる皆さんからの例はすべてうまくいきます.

形:

    private void collectg_Click(object sender, EventArgs e)
    {
        if (_hasBoys)
        {
            return;
        }

        _hasBoys = true;

        List<girl> girls = new List<girl>();

        foreach(var name in System.IO.File.ReadAllLines(@"C:\Path\tofile\girls.txt"))
        {
            girl g = new girl { Name = name };
            girls.Add(g);
        }

        listBox1.DataSource = girls;

    }

    private void collectb_Click(object sender, EventArgs e)
    {
        if (_hasGirls)
        {
            return;
        }

        _hasGirls = true;

        List<boy> boys = new List<boy>();
        foreach (var name in System.IO.File.ReadAllLines(C:\Path\tofile\boys.txt"))
        {
            boy b = new boy { Name = name };
            boys.Add(b);
        }

        listBox1.DataSource = boys;

    }

クラス:

namespace Inlämningsuppgift_v9
{
    class Person
    {
        public string Name { get; set; }

    }

    class girl : Person
    {
        public List<girl> girls { get; set; }

        //public override string  ToString()

        //{
        //    return girls.ToString();
        //}

    }
    class boy : Person
    {
        public List<boy> boys { get; set; }
    }
}
4

5 に答える 5

2

メソッドをオーバーライドToStringして、クラス名の代わりに名前の値を表示します。

class Person
{
    public Gender Gender { get; set; }
    public string Name { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

enum Gender
{
     Male,
     Female
}

派生クラスから性別を設定する方法:

class Girl : Person
{        
    public Girl()
    {
        Gender = Gender.Female;
    }
}

ところで、これはあなたのコードを簡略化したものです:

private void collectg_Click(object sender, EventArgs e)
{
    if (_hasBoys)        
        return;        

    _hasBoys = true;

    listBox1.DataSource = File.ReadAllLines(@"C:\Path\tofile\girls.txt")
                              .Select(line => new Girl { Name = line })
                              .ToList();
}

private void collectb_Click(object sender, EventArgs e)
{
    if (_hasGirls)
        return;

    _hasGirls = true;

    listBox1.DataSource = File.ReadAllLines(@"C:\Path\tofile\boys.txt")
                              .Select(line => new Boy { Name = line })
                              .ToList();
}

また、ハードコーディングされたファイル名を構成ファイルに移動することをお勧めします。そして、実際には、女の子と男の子のクラスを分ける理由がわかりません。ここで Person クラスを 1 つ使用できると思います。このような:

private IEnumerable<Person> GetPersons(Gender gender)
{
    string fileName = // get file name depending on gender
    return File.ReadAllLines(fileName)
               .Select(line => new Person { Name = line, Gender = gender })
               .ToList();
}

基本クラスにデータや動作を追加しない 2 つのクラスの代わりに、次のような作成メソッドを使用できます。

class Person
{
    public static Person CreateBoy(string name)
    {
        return new Person { Name = name, Gender = Gender.Male };
    }

    public static Person CreateGirl(string name)
    {
        return new Person { Name = name, Gender = Gender.Female };
    }

    public Gender Gender { get; private set; }
    public string Name { get; private set; }

    public override string ToString()
    {
        return Name;
    }
}

次に、男の子の作成は次のようになります。Person.CreateBoy(name)

于 2013-02-28T16:14:19.910 に答える
1

こちらで色々と質問させていただいておりますが、できる限りお答えいたします。クラスboygirlが、 を呼び出したときに表示される name 属性を持つことになっている場合は、次のようにしますToString()

class girl : Person
{
    public override string  ToString()

    {
        return Name.ToString(); //ToString is redundant though.
    }

}

なぜあなたがList<girl>クラスに a を入れているのかわからないので、削除しました。

Enum非常に簡単に作成できます。

enum Gender{
   Male,
   Female
}

次に、新しいパラメーターを受け入れるようにクラスを変更します。

于 2013-02-28T16:16:48.947 に答える
0

名前を表示するには、PersonクラスでToStringを正しくオーバーライドできます。

public override string ToString()
    {
        return Name;
    }

または、Kwelが述べたように、ListBoxのDisplayMemerを「Name」に設定します

listBox1.DisplayMember = "Name";

?なぜあなたはあなたの男の子と女の子に男の子と女の子のリストを持たせたいのですか??Personのコンストラクターのパラメーターとして性別がRadioButtonsによって設定されたフィルターを適用する必要があるのはなぜですか?

radioButton1.Checked ... Load girls.txt
radioButton2.Checked .. Load boys.txt
于 2013-02-28T16:37:08.233 に答える
0

このスレッドを読んだ場合C# List<string> to string with delimiterあなたの質問に役立つかもしれません. .com/convert-list-stringhttp://msdn.microsoft.com/en-us/library/system.string.format.aspx お役に立てば幸いです。

于 2013-02-28T16:26:19.777 に答える
0

ええ、人の ToString() はリストボックスの問題を解決するはずです。

特定の表示メンバーを設定することもできます。

listBox1.DisplayMember = "Name";
于 2013-02-28T16:27:59.130 に答える