Это потому, что переменная запоминает длину слова на каждой итерации. Если слово в итерации больше, чем наибольшая длина, наблюдаемая в предыдущих итерациях, это становится новой длиной.
Это легко увидеть при регистрации каждой итерации:
Онлайн-пример: 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!