我经常使用类似的代码。
StringBuilder sb=new StringBuilder();
IEnumberable<MyWidget> MyWidgets=GetMyWidgets();
if(MyWidgets.Count!=0)
{
sb.Append("This is header text");
foreach(MyWidget widget in MyWidgets)
{
sb.Append("This is info about widget: "+widget.SomeInfo);
}
sb.Append("This is footer text");
}
有没有办法让这个更干净?也许使用Lambda表达式或匿名函数(我不熟悉那些,所以一个例子会有帮助)?
如果对象集合中存在项目,那么现实世界的例子就是编写HTML表格。
答案 0 :(得分:3)
除了其他建议之外,使用Any
代替Count
if (MyWidgets.Any())
{
sb.Append("This is header text");
sb.Append(string.Concat("", MyWidgets.Select(x => "This is info about widget: " + x.SomeInfo)));
sb.Append("This is footer text");
}
对于少量数据,原始版本的工作速度会更快,在我的情况下,100个元素的速度要快两倍。但是对于更大的数量,Linq更快,在我的情况下10%的100000项目选择。我不知道怎么回事,但它应该是应该的。
答案 1 :(得分:1)
此代码实际上并不需要任何其他类型的实现。
代码已经足够干净了,意图非常明确。
@RyanWH补充道:
在这种情况下使用LINQ可能会更好,当且仅当它提供了必要的性能提升。最初的问题并不关心速度,所以我同意原始内容很简单,易于理解。
答案 2 :(得分:1)
您可以使用string.Join
将所有这些内容折叠成一个语句:
if(MyWidgets.Count() != 0) {
sb.AppendFormat(
"This is header text\n{0}This is footer text\n"
, string.Join(
"\n"
, MyWidgets.Select(w => string.Format("This is info about widget: {0}\n", w))
)
);
}
答案 3 :(得分:1)
我认为使用string.Join
会提高可读性。而且,由于这个,你不再做很多追加,简单的字符串连接就可以了。
string str = "";
IEnumerable<MyWidget> MyWidgets=GetMyWidgets();
if(MyWidgets.Any())
{
str += "This is header text\n";
str += string.Join("\n", MyWidgets.Select(x => "This is info about widget: "
+ x.SomeInfo));
str += "\nThis is footer text";
}
答案 4 :(得分:0)
StringBuilder sb = new StringBuilder();
List<MyWidget> MyWidgets = GetMyWidgets().ToList();
if(MyWidgets.Count!=0)
{
sb.Append("This is header text");
MyWidgets.Foreach(w => sb.Append("This is info about widget: " + w.SomeInfo));
sb.Append("This is footer text");
}
答案 5 :(得分:0)
你可以替换它:
foreach(MyWidget widget in MyWidgets)
{
sb.Append("This is info about widget: "+widget.SomeInfo);
}
有了这个:
MyWidgets.ToList().ForEach(x => sb.Append("This is info about widget: "+ x.SomeInfo);
答案 6 :(得分:0)
如何准确地将您拥有的内容放入函数中?这种实现没有任何问题,并且在任何意义上它都不是“脏”的。将代码放在更少的行上并不一定意味着它更好。您可以将通用项的通用集合作为输入参数,并返回字符串构建器。删除项目中的任何copypasta代码要比最小化像这样的简单例程的行数要好得多。
如果您正在谈论可能正在进行XML或HTML序列化,那么已经有一些工具可以帮助您。 C#结合了一种在XML中包含事物的声明方式,我想有一个库可以为HTML做同样的事情。实际上,谷歌搜索C#html序列化会引导您在stackoverflow上找到几个有用的帖子。
答案 7 :(得分:0)
这是我个人所做的改变。在我看来,我认为私有方法比尝试LINQ-idize所有内容更具表现力。 我还考虑更改常量的硬编码值,以帮助维护。
public string YourMethod()
{
string text = string.Empty;
IEnumberable<MyWidget> MyWidgets = GetMyWidgets();
if(MyWidgets.Any())
{
text += "This is header text";
text += GetInfoFromWidgets(MyWidgets);
text += "This is footer text";
}
return text;
}
private string GetInfoFromWidgets(IEnumerable<MyWidget> widgets)
{
StringBuilder sb = new StringBuilder();
foreach(MyWidget widget in MyWidgets)
{
sb.Append("This is info about widget: "+widget.SomeInfo);
}
return sb.ToString();
}