Простой итерация массива строк в C # .NET не работает - PullRequest
1 голос
/ 05 января 2011

Это простой код, который должен возвращать true или false после сравнения каждого элемента в массиве String с переменной сеанса.Дело в том, что даже когда строковый массив с именем «plan »получает правильные атрибуты, внутри foreach он продолжает повторяться только по первому элементу, поэтому, если переменная сеанса соответствует другому элементу, отличному от первого в массиве, он никогда не возвращает true... Вы могли бы сказать, что проблема прямо здесь, в цикле foreach, но я не вижу этого ... Я делал это как сто раз, и я не могу понять, что я делаю неправильно ... Спасибо

protected bool ValidatePlans()
{
    bool authorized = false;

    if (RequiredPlans.Length > 0)
    {
        string[] plans = RequiredPlans.Split(',');
        foreach (string plan in plans)
        {
            if (MySessionInfo.Plan == plan)
                authorized = true;
        }
    }
    return authorized;
}

Ответы [ 8 ]

1 голос
/ 05 января 2011

Ваш код выглядит хорошо для меня, но вы можете заменить все это на:

return RequiredPlans.Length > 0 && RequiredPlans.Split(',').Any(s => MySessionInfo.Plan == s);
1 голос
/ 05 января 2011

Возможно, вы захотите использовать Array.IndexOf () вместо выполнения всей работы самостоятельно:

protected bool ValidatePlans()
{
    return (RequiredPlans.Length > 0
        && Array.IndexOf(RequiredPlans.Split(','), MySessionInfo.Plan) >= 0);
}
0 голосов
/ 06 января 2011

Убедитесь, что RequiredPlans действительно содержит уникальные строковые элементы, т.е. убедитесь, что он не возвращает синий, синий, синий.

Во-вторых, как и другие, упомянутые выше, убедитесь, что .Trim () сравнивает и почему бы не добавить .ToLower (), чтобы убедиться, что нет проблем, чувствительных к регистру.

Если все, что в нем, должно четко работать. Если нет, создайте временную строку RequiredPlans, чтобы убедиться, что она работает как отдельный тест.

protected bool ValidatePlans()
{   
    if (RequiredPlans.Length > 0)
    {
        string[] plans = RequiredPlans.Split(',');
        foreach (string plan in plans)
        {
            if (MySessionInfo.Plan.Trim().ToLower() == plan.Trim().ToLower())
                return true;
        }
    }

    return false;
}
0 голосов
/ 05 января 2011

Конечно, RequiredPlans - это строка типа = "Blue, Green"

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

Попробуйте

if (MySessionInfo.Plan == plan.Trim())
0 голосов
/ 05 января 2011

Я не уверен на 100%, что понимаю вашу проблему, но мне интересно, используете ли вы строку вроде:

"Blue, Green"

... и ожидаем, что этот метод вернет true, когда MySessionInfo.Plan равно "Green" (без пробела). Если это проблема, тогда просто в вашем Split результате есть дополнительный пробел. Это можно исправить, изменив это:

if (MySessionInfo.Plan == plan)

... к этому:

if (MySessionInfo.Plan == plan.Trim())

Если это не так, то, возможно, я неправильно понял вашу проблему.

Редактировать : Начиная с вашего комментария к ответу ХАБДЖАНА , я должен спросить: является ли код, который вы отправили точно таким же , как фактический код, который вы используете ? Если это так, я должен почесать голову, поскольку очень неясно, как предложенная им модификация (хотя и хорошая, так как она делает метод более эффективной) могла бы решить вашу проблему.

0 голосов
/ 05 января 2011

Несколько возможностей:

A.Предполагая, что MySessionInfo.Plan не является строго типизированной строкой, попробуйте

if (MySessionInfo.Plan.Equals (plan)) {author = true;перерыв;}

B.После выполнения .split во время сравнения убедитесь, что нет пробелов.Вы можете сделать MySessionInfo.Plan.Equals (plan.Trim ())

C.Не уверен, что означает «foreach продолжает повторяться только по первому элементу».Вы уверены, что цикл не проходит через другие элементы в массиве?

0 голосов
/ 05 января 2011
protected bool ValidatePlans()
{   
    if (RequiredPlans.Length > 0)
    {
        string[] plans = RequiredPlans.Split(',');
        foreach (string plan in plans)
        {
            if (MySessionInfo.Plan == plan)
                return true;
        }
    }

    return false;
}
0 голосов
/ 05 января 2011

Я полагаю, что вам нужно будет подробно установить длину строкового массива "планов", прежде чем добавлять значения через string.split ...

РЕДАКТИРОВАТЬ: Нет, я был не прав ... ваш методзаполнение массива должно работать нормально.Не обращайте внимания на мой ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...