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,而不必编写一百万个 if、else if、else 语句……在 C# 中有简单的方法或库来执行此操作吗?我基本上是在寻找一种仅以简洁明了的方式打印出真实值的方法。有人对我应该如何处理这个问题有任何建议吗?

非常感谢!

编辑 所以这个的最终目标是我有一个大约有 20 个成员的对象。对象会自动填充,填充脚本可以将某些成员留空。我希望能够以 CSV 格式打印成员,而不必有 20 个 if 语句来查看对象中的特定成员是否在通过 streamwriter 输出之前已被实例化。

编辑 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块。

在这种情况下,使用和枚举

internal enum Pail
{
    Butter,
    Milk,
    Water,
    Beer
}
于 2012-06-13T21:39:57.483 回答
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 回答
1

您可以只使用字典,其中键是字段名称,值是字段值。这样您就不需要检查输出是否已填充 - 您只需输出所有字段

只有设置了字典键,您的填充脚本才能填充字典键

然后你的streamwriter就可以走了

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 回答