C# 数组字符串的循环迭代
我目前正试图解决一个标题大写的问题。我有一个方法,把一个句子分成几个单词,然后把单词和一个单词检查表进行比较 根据这个检查列表,如果单词在列表中,我将它们小写。大写:列表中没有的单词。第一个和最后一个单词总是大写 以下是我的方法:C# 数组字符串的循环迭代,c#,visual-studio,for-loop,C#,Visual Studio,For Loop,我目前正试图解决一个标题大写的问题。我有一个方法,把一个句子分成几个单词,然后把单词和一个单词检查表进行比较 根据这个检查列表,如果单词在列表中,我将它们小写。大写:列表中没有的单词。第一个和最后一个单词总是大写 以下是我的方法: public string TitleCase(string title) { LinkedList<string> wordsList = new LinkedList<string>(); string[]
public string TitleCase(string title)
{
LinkedList<string> wordsList = new LinkedList<string>();
string[] listToCheck = { "a", "the", "to", "in", "with", "and", "but", "or" };
string[] words = title.Split(null);
var last = words.Length - 1;
var firstWord = CapitalizeWord(words[0]);
var lastWord = CapitalizeWord(words[last]);
wordsList.AddFirst(firstWord);
for (var i = 1; i <= last - 1; i++)
{
foreach (var s in listToCheck)
{
if (words[i].Equals(s))
{
wordsList.AddLast(LowercaseWord(words[i]));
}
else
{
wordsList.AddLast(CapitalizeWord(words[i]));
}
}
}
wordsList.AddLast(lastWord);
var sentence = string.Join(" ", wordsList);
return sentence;
}
如果仔细看,其中一个和是小写的。如何解决这个问题有什么建议吗
问题出在foreach循环中,您要对每个单词进行八次检查(listToCheck数组的长度),并每次将该单词添加到列表中。我还建议使用Linq查询,因此它应该如下所示:
for (var i = 1; i <= last - 1; i++) {
if(listToCheck.Contains(words[i]))
wordsList.AddLast(LowercaseWord(words[i]));
else
wordsList.AddLast(CapitalizeWord(words[i]));
}
for(var i=1;i如果循环中有一个循环会把事情搞砸,请将代码简化为只有一个循环:
for (var i = 1; i <= last - 1; i++)
{
// No inner loop
// Use the .Contains() method to see if it's a key word
if (listToCheck.Contains(words[i]))
{
wordsList.AddLast(LowercaseWord(words[i]));
}
else
{
wordsList.AddLast(CapitalizeWord(words[i]));
}
}
for(var i=1;i如其他答案中所述,循环中的循环不会退出。
只是一个建议,使用Linq,您可以结合检查第一个单词和最后一个单词(通过索引),并同时检查列表以检查
:
public string TitleCase(string title)
{
string[] listToCheck = { "a", "the", "to", "in", "with", "and", "but", "or" };
string[] words = title.Split(null);
var last = words.Length - 1;
return string.Join(" ", words.Select(w=>w.ToLower()).Select(((w,i) => i == 0 || i == last || !listToCheck.Contains(w) ? CapitalizeWord(w) : w)));
}
注意,在这个解决方案中,第一个Select
确保所有单词都是小写的,因此可以在listToCheck
中进行查找,而无需进行特殊的比较。因为单词已经是小写的,如果单词不必大写,就不必再这样做了。当您你仔细检查每一个要检查的单词,一旦找到匹配项,你就不会退出循环(因此你会在每次检查中添加单词)。要在特定代码中解决此问题,你可以执行以下操作:
for (var i = 1; i <= last - 1; i++)
{
bool foundMatch = false;
foreach (var s in listToCheck)
{
if (words[i].Equals(s))
{
foundMatch = true;
break;
}
}
if (foundMatch)
{
wordsList.AddLast(LowercaseWord(words[i]));
}
else
{
wordsList.AddLast(CapitalizeWord(words[i]));
}
}
在
的上设置一个断点,然后调试代码并按“F10”单步执行并查看发生了什么。使用调试器并单步执行代码。注意您的单词列表是如何增长的,您将看到出现了什么问题……的确如此。我尝试了var result=TitleCase(“为什么鸟会飞?”);Assert.AreEqual(“为什么鸟会飞?”,result);
并且对“a”有问题。上面的代码解决了这个问题。谢谢。
for (var i = 1; i <= last - 1; i++)
{
bool foundMatch = false;
foreach (var s in listToCheck)
{
if (words[i].Equals(s))
{
foundMatch = true;
break;
}
}
if (foundMatch)
{
wordsList.AddLast(LowercaseWord(words[i]));
}
else
{
wordsList.AddLast(CapitalizeWord(words[i]));
}
}
public static string TitleCase(string title)
{
var listToCheck = new[]{ "a", "the", "to", "in", "with", "and", "but", "or" };
var words = title.Split(null);
// Loop through all words in the array
for (int i = 0; i < words.Length; i++)
{
// If we're on the first or last index, or if
// the word is not in our list, Capitalize it
if (i == 0 || i == (words.Length - 1) ||
!listToCheck.Contains(words[i], StringComparer.OrdinalIgnoreCase))
{
words[i] = CapitalizeWord(words[i]);
}
else
{
words[i] = LowercaseWord(words[i]);
}
}
return string.Join(" ", words);
}