Foreach清晰地写出页眉和页脚

时间:2013-05-23 16:25:40

标签: c# foreach

我经常使用类似的代码。

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表格。

8 个答案:

答案 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();
}