Есть ли лучший способ ничего не делать в последовательности if, else if, else - PullRequest
0 голосов
/ 04 февраля 2019

Я делаю последовательность if, else if, else внутри цикла foreach.В одном из штатов я не хочу ничего делать.Выглядит немного странно, и мне интересно, есть ли лучший способ сделать это?

foreach (var item in collection)
{
    if (item.Contains("some text"))
    {
        removeNext = true;
        myList.Add(item);
    }
    else if (item.ToUpper().Contains("TEXT IN UPPER") | item.Contains("some other text"))
    {
        // do nada
    }
    else if (removeNext)
        removeNext = false;
    else
        myList.Add(item);
}

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

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

foreach (var item in collection)
{
    bool removeCurrent = removeNext;
    removeNext = false;
    if (item.Contains("some text"))
    {
        removeNext = true;
        removeCurrent = false;
    }
    else if (item.ToUpper().Contains("TEXT IN UPPER") | item.Contains("some other text"))
    {
        removeCurrent = false;
    }

    if (!removeCurrent)
        myList.Add(item);
}
0 голосов
/ 05 февраля 2019

Просто чтобы дать еще одну возможность, вы можете включить всю логику в оператор Where и вообще избежать цикла.Это использует тот факт, что назначение возвращает результат назначения, что позволяет нам одновременно установить переменную removeNext и обеспечить включение нескольких элементов "some text", даже если они соседствуют друг с другом в коллекции.

Обратите внимание, что эта идея скорее для забавы, чем для реального кода, так как ее трудно прочитать и она будет подвержена ошибкам, если кто-то попытается обновить ее:

bool removeNext = false;

var myList = collection.Where(i =>
    !(i.ToUpper().Contains("TEXT IN UPPER") || i.Contains("some other text")) &&
    (!removeNext | (removeNext = i.Contains("some text"))));

Пояснение

Условие перед && удаляет весь текст, который нам определенно не важен.По сути, это был мой комментарий к вашему первоначальному вопросу (и это было бы хорошим решением для предварительной фильтрации ваших результатов).Вторая часть && гласит:

"Выберите элемент, если removeNext равно false ИЛИ, если результат присваивания removeNext = i.Contains("some text") равен true"

Ключ | здесь ключевой, потому что даже если removeNext равен false, мы все равно хотим выполнить назначение во второй части.

Мы не используем || оператор, потому что это оператор короткого замыкания , означающий, что если первая часть вернет true, то не будет необходимости оценивать вторую часть (обычно мы хотим эту оптимизацию), и значение removeNextникогда не изменится.

0 голосов
/ 04 февраля 2019

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

При желании вы также можете отменить условие, чтобы получить if (!removeNext), что делает код немного укороченным и, возможно, более читабельным, но также делает назначение removeNext = false потенциально бесполезным, поскольку оно уже может быть ложным (но это незначительное наказание).

foreach (var item in collection)
{
    if (item.Contains("some text"))
    {
        removeNext = true;
        myList.Add(item);
    }
    else if (!(item.ToUpper().Contains("TEXT IN UPPER") | item.Contains("some other text")))
    {
        if (!removeNext)
            myList.Add(item);
        removeNext = false;
    }
}

Но лично я думаю, что «плоский», невыполненный if, который у вас есть, намного легче читать, а команда continue с небольшой строкойкомментарий, было бы хорошо и понятно, что у этого блока намеренно нет кода и почему.

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