C# 如何在没有正则表达式或任何外部方法的情况下消除双空格?

C# 如何在没有正则表达式或任何外部方法的情况下消除双空格?,c#,whitespace,palindrome,removing-whitespace,C#,Whitespace,Palindrome,Removing Whitespace,这是在大学课程中给我们的额外练习,我们需要找出一个句子是否包含回文。然而,确定一个单词是否是回文是相当容易的,可能会有这样一种情况:给定的句子是这样的:“狗-猫-卡贾克之家”。我的逻辑是,使用我已经编写的函数,首先确定一个字符是否是字母,如果不是,则删除它。然后计算空格数+1,找出一个句子中有多少单词,准备这些单词的数组,然后使用一个函数检查数组中每个元素上的单词是否为回文。然而,双空间会在“计数”阶段把一切搞得一团糟。我花了大约一个小时摆弄代码来做这件事,但是我不能完全理解这件事。有人能帮我吗

这是在大学课程中给我们的额外练习,我们需要找出一个句子是否包含回文。然而,确定一个单词是否是回文是相当容易的,可能会有这样一种情况:给定的句子是这样的:“狗-猫-卡贾克之家”。我的逻辑是,使用我已经编写的函数,首先确定一个字符是否是字母,如果不是,则删除它。然后计算空格数+1,找出一个句子中有多少单词,准备这些单词的数组,然后使用一个函数检查数组中每个元素上的单词是否为回文。然而,双空间会在“计数”阶段把一切搞得一团糟。我花了大约一个小时摆弄代码来做这件事,但是我不能完全理解这件事。有人能帮我吗?请注意,我不应该使用任何外部方法或库。我已经用正则表达式完成了这项工作,这相当容易,但是我想“合法地”完成这项工作。提前谢谢

只需在空间上拆分,诀窍是删除空的。Google
StringSplitOptions.RemoveEmptyEntries


然后很明显地加入一个干净的空间

只要在空间上拆分,诀窍就是删除空的。Google
StringSplitOptions.RemoveEmptyEntries


然后用一个干净的空格连接,您可以将感兴趣的所有字符复制到一个新字符串中:

var copy = new StringBuilder();

// Indicates whether the previous character was whitespace
var whitespace = true;

foreach (var character in originalString)
{
    if (char.IsLetter(character))
    {
        copy.Append(character);
        whitespace = false;
    }
    else if (char.IsWhiteSpace(character) && !whitespace)
    {
        copy.Append(character);
        whitespace = true;
    }
    else
    {
        // Ignore other characters
    }
}

您可以将感兴趣的所有字符复制到新字符串中:

var copy = new StringBuilder();

// Indicates whether the previous character was whitespace
var whitespace = true;

foreach (var character in originalString)
{
    if (char.IsLetter(character))
    {
        copy.Append(character);
        whitespace = false;
    }
    else if (char.IsWhiteSpace(character) && !whitespace)
    {
        copy.Append(character);
        whitespace = true;
    }
    else
    {
        // Ignore other characters
    }
}

如果您正在寻找最基本/最古老的世界选项,这将起作用。但除了以说明性的方式,没有人会真正这样做

string test = "Dog cat       kajak house"; // Your string minus any non-letters
int prevLen;
do
{
    prevLen = test.Length;
    test = test.Replace("  ", " "); // Repeat-replace double spaces until none left
} while (prevLen > test.Length);
就个人而言,我可能会执行以下操作,以检查一系列单词:

string[] words = test.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

如果您正在寻找最基本/最古老的世界选项,这将起作用。但除了以说明性的方式,没有人会真正这样做

string test = "Dog cat       kajak house"; // Your string minus any non-letters
int prevLen;
do
{
    prevLen = test.Length;
    test = test.Replace("  ", " "); // Repeat-replace double spaces until none left
} while (prevLen > test.Length);
就个人而言,我可能会执行以下操作,以检查一系列单词:

string[] words = test.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);


关于regex什么是非法的,请发布一些代码让我们与Jakub合作,你只需说明你想做什么:)无需解释你的项目等:)谷歌。。正则表达式是非法的,因为它需要使用System.Text.RegularExpressions;工作。我得到了if(句子[I]=''){if(I!=句子.Length-1&&句子[I+1]=''{//想弹出一个空格}}但是我不知道是否有办法“弹出”这个元素。Re:“我不应该使用任何外部方法或库”。什么使方法或库成为外部的?是
string.Length
外部(它的getter和setter方法在
System.dll
中,那么
StringBuilder
呢(在
System.Text.dll
中)?Flydog57,问题不是检查一个句子是否是回文,而是检查一个句子是否包含回文。regex有什么非法之处,请发布一些代码让我们与Jakub合作,你只需说明你想做什么:)无需解释你的项目等:)谷歌。。正则表达式是非法的,因为它需要使用System.Text.RegularExpressions;工作。我得到了if(句子[I]=''){if(I!=句子.Length-1&&句子[I+1]=''{//想弹出一个空格}}但是我不知道是否有办法“弹出”这个元素。Re:“我不应该使用任何外部方法或库”。什么使方法或库成为外部的?是
string.Length
外部(它的getter和setter方法在
System.dll
中,那么
StringBuilder
呢(在
System.Text.dll
中)?Flydog57,问题不是检查一个句子是否是回文,而是检查一个句子是否包含回文。这将是一个很好的解决方案,但是,正如我所说,我需要所有方法都是“我的”,所以。替换()这是主要的问题。@Jakubapko那么你就必须编写自己的编程语言——这是一个非常人为的限制。你甚至在示例代码中使用
Length
,它与
Replace
在同一个
mscorlib
系统库中。是的,长度是我们唯一需要的东西实际上可以使用与字符串相关的方法。
Length
是字符串属性,
Replace
是字符串方法、相同的库(mscorlib.dll)、相同的命名空间(系统).你确定你没有误解别人对你的要求吗?恐怕我不得不把它留在那里,因为这个问题不是现实生活中的问题。不管它叫什么,我只是在这一点上感到厌倦了lmao。所有使用的方法都必须由我们编写,所以无论怎样替换都是无效的。这将是一个伟大的解决方案,但是,正如我所说的,我需要所有的我方法是“我的”,所以。替换()这是主要的问题。@Jakubapko那么你就必须编写自己的编程语言——这是一个非常人为的限制。你甚至在示例代码中使用
Length
,它与
Replace
在同一个
mscorlib
系统库中。是的,长度是我们唯一需要的东西实际上可以使用与字符串相关的方法。
Length
是字符串属性,
Replace
是字符串方法、相同的库(mscorlib.dll)、相同的命名空间(系统).你确定你没有误解别人对你的要求吗?恐怕我不得不把它放在那里,因为这个问题不是现实生活中的问题。不管它叫什么,我只是在这一点上感到厌倦了lmao。所有使用的方法都必须由我们编写,所以无论怎样替换都是无效的。