【问题标题】:Building a table from string C#从字符串 C# 构建表
【发布时间】:2015-02-06 17:21:08
【问题描述】:

好的,所以我有一个 <tr> 表,它是从一个看起来像这样的字符串构建的:13467

1= monday
2= tuesday
...
7= sunday
so 13467 = mon,wed,thurs,sat,sun

我现有的代码手动检查了字符串,像这样

if (breakfastDays.Contains("1")) {
        sb.Append("<td class=\"active\">&nbsp;</td>");
        mo++;
    } else {
        sb.Append("<td>&nbsp;</td>");
    }

    if (breakfastDays.Contains("2")) {
        sb.Append("<td class=\"active\">&nbsp;</td>");
        tu++;
    } else {
        sb.Append("<td>&nbsp;</td>");
    }

class="active" 部分只是告诉css 选中该框。

有没有更简单的方法来检查字符串?

也许是一些for-in 循环?

【问题讨论】:

  • 这里有很多难以理解的地方,但是如果您想知道是否有更好的方法来确定早餐日是包含“1”还是“5”,早餐日.Contains() 大约是尽其所能。
  • 如果您说明为什么必须在此代码中增加 motu,我们可能会处于更好的位置。
  • 你为什么不每天吃早餐呢?问题解决了!
  • 嗯。使用字符串生成器构建 html 似乎是一件苦差事。你确定你不想为此使用模板引擎吗? weblogs.asp.net/scottgu/introducing-razor

标签: c# html html-table contains stringbuilder


【解决方案1】:

我会先看看您是否可以摆脱日间计数器的单个变量,这看起来很笨重且容易出现问题。那,并将其简化为一个简单的循环,例如:

// Set up buckets for each day, with an initial count of 0
var dayMap = "1234567".ToDictionary(c => c, c => 0);

// For each key ("day")...
foreach (var day in dayMap.Keys.ToList())
{
    // Start writing the cell
    sb.Append("<td");
    // Check if input string contains that key
    if (breakfastDays.Contains(day)) 
    {
        // Increment the value in our day bucket
        dayMap[day]++;
        // Make the cell "active"
        sb.Append(" class=\"active\"");
    } 
    // Finish writing the cell
    sb.Append(">&nbsp;</td>");
}

【讨论】:

    【解决方案2】:

    我认为 motu 是计数一周中的天数的计数。更好的方法可能是数组:

    public static void Main()
    {
        int[] breakfastDays = new int[7];
        string days = "13467";
        var sb = new StringBuilder();
    
        for (int i = 0; i < 7; i++)
        {
            if (days.Contains((i + 1).ToString()))
            {
                sb.Append("<td class=\"active\">&nbsp;</td>");
                breakfastDays[i]++;
            } else {
                sb.Append("<td>&nbsp;</td>");
            }
        }
    
        Console.WriteLine(sb.ToString());
    }
    

    这样,您就不需要每天都使用单独的变量了。

    【讨论】:

      【解决方案3】:

      是的,您可以使用循环。唯一棘手的是你增加的变量,如果你使用数组会更容易。

      for (char c = '1'; c <= '7'; c++) {
        if (breakfastDays.Contains(c)) {
          sb.Append("<td class=\"active\">&nbsp;</td>");
          switch (c) {
            case '1': mo++; break;
            case '2': tu++; break;
            case '3': we++; break;
            case '4': th++; break;
            case '5': fr++; break;
            case '6': sa++; break;
            case '7': su++; break;
          }
        } else {
          sb.Append("<td>&nbsp;</td>");
        }
      } 
      

      【讨论】:

      • 使用switch 而不是if else if else 的完美实例。 +1
      • 我不得不做Contains(Convert.ToString(c))),但除了那个完美的答案。非常感谢!
      • @DPB:啊哈,采用 char 的方法是 System.Linq 命名空间中的扩展方法。如果包含它,则可以直接使用 char。我在一个已经包含它的项目中测试了代码。
      • @Guffa 我刚刚实现了System.Linq,谢谢,就像一个魅力。
      【解决方案4】:

      这将解决必须为表编写七个测试的问题:

      for (int i = 1; i <= 7; i++)
      {
          if (breakfastDays.Contains(i.ToString())
          {
              sb.Append("<td class=\"active\">&nbsp;</td>"));
          }
          else
          {
              sb.Append("<td>&nbsp;</td>");
          }
      }
      

      我们当然可以变得更聪明,但我不想跳过代码中 mo++tu++ 的重要性。

      【讨论】:

        猜你喜欢
        • 2016-01-21
        • 2013-12-11
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        相关资源
        最近更新 更多