Построение таблицы из строки C#


Итак, у меня есть таблица <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 петли?

4 3

4 ответа:

Да, вы можете использовать цикл. Единственная сложность-это переменные, которые вы увеличиваете, было бы проще, если бы вы использовали массив для этого.

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>");
  }
} 

Я думаю, что mo и tu являются счетами, которые ведут счет дней недели. Лучшим способом может быть массив:

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

Таким образом, вам не понадобятся отдельные переменные для каждого дня.

Я бы сначала посмотрел, можно ли избавиться от отдельных переменных для счетчиков дня, которые кажутся неуклюжими и подверженными проблемам. Это, и сведение этого к простому циклу, что-то вроде:

// 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>");
}

Это исправит проблему необходимости написания семи тестов для таблицы:

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++ в вашем коде.