0

メンバーのリストがあり、それぞれがカスタムオブジェクトであるとします。

public class pail
{
    public string milk;
    public string water;
    public string butter;
    public string beer;
}



public class AddToPail()
{
    private List<pail> _pailList = new List<pail>();
    PSVM(String[] args)
    {
        for(int i = 0; i < 200; i++)
        {
            pail newPail = new Pail();
            switch(i)
            {
                case 1:
                {
                    newPail.milk = "This pail has milk";
                }
                break;
                case 2:
                {
                    newPail.butter = "This pail has butter";
                }
                break;
                case 3:
                {
                    newPail.water = "This pail has water";
                }
                break;
                case 4:
                {
                    newPail.beer = "This pail has beer";
                }
                break;
            }
            _pailList.Add(newPail);
        }
        foreach (pail thisPail in _pailList)
        {
            using (StreamWriter SW = new StreamWriter(@"C:\pail.txt")
            {
                if (!thisPail.milk.IsNullOrEmpty())
                {
                    SW.WriteLine(thisPail.milk);
                }
                else if (!thisPail.butter.IsNullOrEmpty())
                {
                    SW.WriteLine(thisPail.butter);
                }
                else if (!thisPail.beer.IsNullOrEmpty())
                {
                    SW.WriteLine(thisPail.beer);
                }
                else if (!thisPail.water.IsNullOrEmpty())
                {
                    SW.WriteLine(thisPail.water);
                }
                else
                {
                    Console.Writeline("oops");
                }
            }
        }
    }
}

百万を書かなくても真の値のみを出力するStreamWriterを設定したいとします。そうでなければ、elseステートメント... C#でこれを行う簡単な方法またはライブラリはありますか?私は基本的に、真の値をきちんと簡潔に印刷する方法を探しています。私がこれにどのように取り組むべきかについて誰かが何かアドバイスがありますか?

どうもありがとうございます!

編集 したがって、これの最終的な目標は、約20人のメンバーを持つオブジェクトを作成することです。オブジェクトは自動的に入力され、入力スクリプトは一部のメンバーを空のままにすることができます。メンバーをCSV形式で印刷できるようにしたいのですが、ストリームライターを介して出力する前に、オブジェクト内の特定のメンバーがインスタンス化されているかどうかを確認するために20個のifステートメントを用意する必要はありません。

編集2

コードを変更して、必要なものに少し近づけました。前の悪い説明でごめんなさい。

4

4 に答える 4

5

プログラムを少しリファクタリングする必要があると思います。手始めに、バケットの内容に列挙型を使用します。

public enum EBucketContents { Milk, Water, Butter, Beer };

次に、ブール値のリストを作成する代わりに、辞書を使用できます。

var pail = Dictionary<EBucketContents,bool>();

これで、正しいものだけを出力するのは簡単なことです。

foreach( var kvp in pail.Where( x => x.Value ) ) {
    SW.WriteLine( "pail has " + kvp.Key.ToString().ToLower() )
}
于 2012-06-13T21:40:03.013 に答える
1

タイピングを節約したいだけの場合は、次の拡張メソッドを使用してください。

internal static class Extensions
{
    public static void WriteLineIf(this TextWriter tw, bool condition, string text)
    {
        if (condition)
        {
            tw.WriteLine(text);
        }
    }
}

else ifしかし、ブロックを使用しているので、これらのboolの1つだけが真になる可能性があるように見えます。

その場合、使用して列挙型

internal enum Pail
{
    Butter,
    Milk,
    Water,
    Beer
}
于 2012-06-13T21:39:57.483 に答える
1

キーがフィールド名で、値がフィールド値であるディクショナリを使用できますか。このように、出力が入力されているかどうかを確認する必要はありません。すべてのフィールドを出力するだけです。

入力するスクリプトは、辞書キーが設定されている場合にのみ、辞書キーに入力できます

その後、あなたのストリームライターはただ行くことができます

foreach(KeyValuePair<string, string> kvp in fieldsDict)
   sw.Write("Key: " + kvp.Key + ", Value: " + kvp.Value);

または、文字列/列挙型のリストだけでも

例えば

public class pail
{
    public List<string> Fields = new List<string>();
}


public class AddToPail()
{
    private List<pail> _pailList = new List<pail>();

    PSVM(String[] args)
    {
        for(int i = 0; i < 200; i++)
        {
            pail newPail = new Pail();
            switch(i)
            {
                case 1:
                {
                   newPail.Fields.Add("This pail has milk");
            }
            break;
         *** SNIP
于 2012-06-13T21:49:14.370 に答える
1

もちろん、辞書を使用することで問題を解決することはできますが、この種の解決策はあまり好きではありません。たとえば、飛行機を持ったバケツになってしまう可能性があるため、入れているものをある程度制御できなくなるからです。私はあなたのコードをこのようなものでリファクタリングし、すべてのクラスに独自の責任を与えようとします(ところで、私はクラス名としてAddToPailが好きではなく、よりメソッド名です):

public class Pail
{
    public string milk;
    public string water;
    public string butter;
    public string beer;

   private bool everythingEmpty = true;

    public Pail(int i)
    {
            switch(i)
            {
                case 1:
                {
                    milk = "This pail has milk";
                    everythingEmpty = false;
                }
                break;
                case 2:
                {
                    butter = "This pail has butter";
                    everythingEmpty = false;
                }
                break;
                case 3:
                {
                    water = "This pail has water";
                    everythingEmpty = false;
                }
                break;
                case 4:
                {
                    beer = "This pail has beer";
                    everythingEmpty = false;
                }
                break;
            }
    }

    public void WriteToStream(StreamWriter SW)
    {
           if (everythingEmpty)
           {
               Console.Writeline("oops");
               return;
           }
           WriteToStream(milk, SW);
           WriteToStream(butter, SW);
           WriteToStream(beer, SW);
           WriteToStream(water, SW);
    }

    public static void WriteToStream(string content, StreamWriter SW)
    {
                if (!content.IsNullOrEmpty())
                {
                    SW.WriteLine(content);
                }
    }
}



public class AddToPail()
{
    private List<pail> _pailList = new List<pail>();
    PSVM(String[] args)
    {
        for(int i = 0; i < 200; i++)
        {
            pail newPail = new Pail(i);
            _pailList.Add(newPail);
        }
        foreach (pail thisPail in _pailList)
        {
            using (StreamWriter SW = new StreamWriter(@"C:\pail.txt")
            {
                thisPail.WriteToStream(SW);
            }
        }
    }
}
于 2012-06-14T05:05:02.273 に答える