Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数组字符串的循环迭代_C#_Visual Studio_For Loop - Fatal编程技术网

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);
}