假设我有一个成员列表,每个成员都是一个自定义对象:
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,否则if,else语句......在C#中有一个简单的方法或库吗?我基本上都在寻找一种方法,只能以简洁明了的方式打印出真正的价值观。有没有人对如何处理这个问题有任何建议?
非常感谢!
修改 的 因此,我的最终目标是拥有一个拥有大约20名成员的对象。该对象会自动填充,填充脚本可能会将某些成员留空。我希望能够以CSV格式打印成员,而不必有20个if语句,以便在通过streamwriter输出之前查看对象中的特定成员是否已被实例化。
编辑2
我将代码更改为更接近我需要它做的事情。对不起以前的不良解释。
答案 0 :(得分: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() )
}
答案 1 :(得分:1)
如果您只想保存一些输入法,请使用以下扩展方法:
internal static class Extensions
{
public static void WriteLineIf(this TextWriter tw, bool condition, string text)
{
if (condition)
{
tw.WriteLine(text);
}
}
}
但看起来只有其中一个bool才是真的,因为你正在使用else if
块。
在这种情况下,请使用和枚举
internal enum Pail
{
Butter,
Milk,
Water,
Beer
}
答案 2 :(得分:1)
你能使用一个字典,其中键是字段名称,值是字段值。这样您就不需要检查输出是否已填满 - 您只需输出所有字段
只有设置了
,填充脚本才能填充字典键然后您的输家可以去
foreach(KeyValuePair<string, string> kvp in fieldsDict)
sw.Write("Key: " + kvp.Key + ", Value: " + kvp.Value);
甚至只是一个字符串/或枚举列表
e.g。
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
答案 3 :(得分:1)
当然使用词典可以解决你的问题,但我并不是真的喜欢这种解决方案,因为它会让你失去对你所投入的东西的控制权,例如你最终会得到一架带飞机的桶...我会在这样的事情中重构你的代码,试图让每个类都有自己的责任(BTW我不喜欢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);
}
}
}
}