Можно ли использовать подстановочный знак или строку «содержит» в switch {case}?осторожность: многословно - PullRequest
2 голосов
/ 10 апреля 2011

Будучи новичком в программировании, я читаю много примеров кода и пытаюсь все взломать, пытаясь понять, что работает. Я работаю с html agility pack, пытаясь удалить страницу новостей.

Проблема: один из тестируемых узлов не использует статическое значение, он использует время просмотра. Как я могу применить это к методу switch {case}. Я также открыт для любых предложений, если я далеко от базы во всем этом подходе.

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

Я решил использовать пример с переключателем,

var rows = doc.DocumentNode.SelectNodes(".//*[@id='weekdays']/tr");
            foreach (var row in rows)
            {
                var cells = row.SelectNodes("./td");
                string title = cells[0].InnerText;
                var valueRow = cells[2];
                switch (title)
                {
                    case "Date":
                        HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                        Console.WriteLine("UPC=A:\t" + date.InnerText);
                        break;

                    case "":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("Time:\t" + Time);
                        break;


                    case "News":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("News:\t" + News);
                        break;
                }

выдержка из HTML

<table id="weekdays" cellpadding="6" cellspacing="0" border="0" width="100%">
                    <tr>
                        <td class="thead" style="border-bottom: 1px solid #d1d1e1;font-weight:normal; text-align: center; width:8%; padding-left: 6px;">Date</td>
                        <td class="thead" style="border-bottom: 1px solid #d1d1e1;font-weight:normal; width:8%; text-align: center; white-space:nowrap"><a href="guestcp.php?do=customoptions" title="Time &amp; Date Options"><img style="position:relative; vertical-align: bottom;" src="images/misc/clock_small.gif" title="Time &amp; Date Options" alt="Time &amp; Date Options" border="0" /></a><a href="guestcp.php?do=customoptions" title="Time &amp; Date Options"><span id="ff_nowtime_clock">3:20pm</span></a></td>
                        <td class="thead" style="border-bottom: 1px solid #d1d1e1;font-weight:normal; text-align: center; width:8%;">News</td>

.........

                    <tr id="detail_row_seek_37876">

        <td id="toprow_9" class="alt1 espace" rowspan="3" style="vertical-align: top; text-align: center;" nowrap="nowrap">
            <span class="smallfont">
                <div>Sat</div>
                Apr 9
            </span>
        </td>

    <td class="alt1 espace" style="text-align: center;" nowrap="nowrap">

            <span class="smallfont">Day 3</span>


    </td>
    <td class="alt1 espace" style="text-align: center;"><span class="smallfont">EUR</span></td>
    <td class="alt1 espace" style="padding-top: 2px" align="center">


<a name="chart=37876" style="position:absolute; margin-top: -10px;"></a><a name="details=37876" style="position:absolute; margin-top: -10px;"></a>


<div class="cal_imp_medium" title="Medium Impact Expected"></div></td>
    <td class="alt1 espace">

        <div class="smallfont" id="title_37876" style="padding-left: 11px;">ECOFIN Meetings</div>

    </td>

Проблема в том, что так называемый столбец времени не является статическим, он фактически использует значение времени. Есть ли способ использовать подстановочный знак в кейсе или способ «содержать», чтобы обойти эту очень многословную проблему?

Ответы [ 4 ]

5 голосов
/ 10 апреля 2011

Вы должны использовать постоянные значения в каждом случае оператора switch.

Единственный способ для вас сделать то, что вы хотите, - это использовать default: - в этом случае по умолчанию вы можете проверить значение, которое вы ищете, используя contains, * 1005. * или Regex тест с использованием if.

Я не мог точно следовать вашему примеру кода HTML (извините!) - но модифицированный C # может выглядеть примерно так:

            switch (title)
            {
                case "Date":
                    HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                    Console.WriteLine("UPC=A:\t" + date.InnerText);
                    break;


                case "News":
                    string News = valueRow.InnerText;
                    Console.WriteLine("News:\t" + News);
                    break;

                default:
                    if (regexTime.Match(title))
                    {
                        string Time = valueRow.InnerText;
                        Console.WriteLine("Time:\t" + Time);
                    }
                    break;
            }
2 голосов
/ 10 апреля 2011

Вы можете использовать «case default:» и поместить в него условие, которое будет проверять.

 switch (title) {
                    case "Date":
                        HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                        Console.WriteLine("UPC=A:\t" + date.InnerText);
                        break;

                    case "News":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("News:\t" + News);
                        break;

                    case default:
                        if (whatever you need) {
                            ...
                        }
                        break;
                }
1 голос
/ 10 апреля 2011

Добавьте реализацию по умолчанию и добавьте туда дополнительные проверки условий.Или вам может быть лучше, если просто заявления.

switch (title)
        {
            case "Date":
                HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                Console.WriteLine("UPC=A:\t" + date.InnerText);
                break;

            case "":
                string Time = valueRow.InnerText;
                Console.WriteLine("Time:\t" + Time);
                break;


            case "News":
                string Time = valueRow.InnerText;
                Console.WriteLine("News:\t" + News);
                break;

            default:
                // put special time condition check logic here.
        }
1 голос
/ 10 апреля 2011

Регистр должен быть константным выражением. см. MSDN . Если вы сможете перейти на использование if-else, у вас будет больше свободы.

...