Как работает foreach l oop и условие if? - PullRequest
0 голосов
/ 05 мая 2020
public static string returnLongestWord()
{
    string input = Console.ReadLine();
    string[] words = input.Split(' ');
    string maxWord = "";
    int ctr = 0;
    foreach (var word in words)
    {
        if (word.Length > ctr)
        {
            maxWord = word;
            ctr = word.Length;
        }
    }
    return maxWord;
}

Мой код в основном находит самое длинное слово во вводе пользователя.

Меня беспокоит foreach l oop. В общем, я полагаю, что он проходит через список массивов всех слов.

Теперь условное l oop if. Я понимаю, что если оно больше 0, это, очевидно, длинное слово, но в основном любое слово, вводимое пользователем, больше 0, так как эти 2 цикла определяют самое длинное слово?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

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

Это легко увидеть при регистрации каждой итерации:

Онлайн-пример: https://dotnetfiddle.net/oFBicx

public class Program
{
    public static void Main()
    {
        var longestWord = returnLongestWord(new []{ "word1", "word12", "word1234", "mostdefinitelythelongestword!", "aShorterWord", "anotherShortWordThanTheMax"});

        Console.WriteLine("\nDone - longest word: " + longestWord);
    }

    public static string returnLongestWord(string[] words)
    {
        string maxWord = "";
        int ctr = 0;
        foreach (var word in words)
        {

            if (word.Length > ctr)
            {
                maxWord = word;
                ctr = word.Length;
            }

            Console.WriteLine("ctr: " + ctr + ", for word:\t " + maxWord);
        }
        return maxWord;
    }
}

выходы:

ctr: 5, for word:     word1
ctr: 6, for word:     word12
ctr: 8, for word:     word1234
ctr: 29, for word:     mostdefinitelythelongestword!
ctr: 29, for word:     mostdefinitelythelongestword!
ctr: 29, for word:     mostdefinitelythelongestword!

Done - longest word: mostdefinitelythelongestword!

Однако эта функция может быть написана немного по-другому, при этом достигая того же самого, способом, который немного легче читать. Сейчас максимальная длина строки хранится в переменной ctr, а слово для этой длины запоминается в maxWord. Однако, поскольку мы можем вычислить длину самого большого найденного слова, нам не нужно это запоминать. В нашем условии мы можем затем пересчитать длину и использовать ее для сравнения с текущим словом:

online sample2: https://dotnetfiddle.net/4C7eZB

    public static void Main()
    {
        var longestWord = returnLongestWord(new []{ "word1", "word12", "word1234", "mostdefinitelythelongestword!", "aShorterWord", "anotherShortWordThanTheMax"});

        Console.WriteLine("\nDone - longest word: " + longestWord);
    }

    public static string returnLongestWord(string[] words)
    {
        string largestWordFound = string.Empty; 
        foreach (var word in words)
        {

            if (word.Length > largestWordFound.Length)
            {
                largestWordFound = word;
            }

            Console.WriteLine("Largest word length: " + largestWordFound.Length + ", for word:\t " + largestWordFound);
        }
        return largestWordFound;
    }

выводит:

Largest word length: 5, for word:     word1
Largest word length: 6, for word:     word12
Largest word length: 8, for word:     word1234
Largest word length: 29, for word:     mostdefinitelythelongestword!
Largest word length: 29, for word:     mostdefinitelythelongestword!
Largest word length: 29, for word:     mostdefinitelythelongestword!

Done - longest word: mostdefinitelythelongestword!
0 голосов
/ 05 мая 2020

Нет if-l oop или условного l oop. Только условие внутри al oop. Это совершенно нормально. Обычно вы хотите сравнить значения с чем-то или что-то сделать с некоторыми из значений (обработка)

Кажется, этот код пытается найти самое длинное слово. Для этого нужно просмотреть каждое слово и сравнить его с самым длинным словом. Этот код сохраняет значения для самого длинного ранее слова с использованием переменных maxWord и ctr. Оба значения инициализируются для пустой строки, потому что альтернативой будет тонна дополнительной обработки регистра в if.

Обратите внимание, что вы можете обойтись без ctr, а имя на самом деле несколько проблематично c - звучит очень похож на конструктор. Просто используйте maxWord.Lenght, чтобы сравнить его с длиной предыдущего слова. Но, помимо этой дополнительной переменной, я бы сделал это именно так.

foreach - это особый вариант for l oop. Он идет только вперед, у вас нет индексатора для управления, и он может работать с такими вещами, как перечислители. Но обратная сторона - то, что вы не можете изменить коллекцию во время бега по ней. В этом случае, однако, операция является чисто чтением - так что никаких проблем.

Вот как я бы это изменил:

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