检查字符串是否包含某些字母的C#方法

时间:2018-01-14 21:17:18

标签: c#

我试图创建一个带有两个参数的方法," word"和"输入"。该方法的目的是打印任何单词,其中所有字符都可以在"输入"不超过一次(这就是为什么如果找到一个字母就删除该字符的原因。)

并非所有来自"输入"必须在" word" - 例如,输入=" cacten"和word =" ace",将打印单词,但如果word =" aced"那就不会了。

然而,当我运行该程序时,它会产生意想不到的结果(单词长于"输入",包含未在&#34中找到的字母;输入"),并以多种方式编写解决方案都具有相同的结果。这让我困扰了几个小时,我无法弄清楚出了什么问题。任何和所有的帮助将不胜感激,谢谢。我的方法的完整代码如下所示。

    static void Program(string input, string word)
    {
        int letters = 0;
        List<string> remaining = new List<string>();

        foreach (char item in input)
        {
            remaining.Add(item.ToString());
        }

        input = remaining.ToString();

        foreach (char letter in word)
        {
            string c = letter.ToString();

            if (input.Contains(c))
            {
                letters++;
                remaining.Remove(c);
                input = remaining.ToString();
            }
        }

        if (letters == word.Length)
        {
            Console.WriteLine(word);
        }
    }

4 个答案:

答案 0 :(得分:2)

好的,只是为了解决你出错的地方。

首先将remaining.ToString()分配给输入变量。你实际分配的是这个System.Collections.Generic.List1[System.String]。对List上的ToString执行操作只会为您提供列表类型。它不会加入你所有的角色。这可能是让你遇到问题的主要因素。

此外,你强迫一切都变成字符串类型,并且你很多时候都不需要,因为字符串已经实现了IEnumerable,只需执行myString.ToList()就可以将字符串作为字符列表 所以没有必要这样做:

 foreach (char item in input)
 {
    remaining.Add(item.ToString());
 }

像string.Contains这样的东西有重载,因此再次使用chars不需要在这里创建字符串:

foreach (char letter in word)
{
    string c = letter.ToString();

    if (input.Contains(c))
    {
        letters++;
        remaining.Remove(c);
        input = remaining.ToString();
    }
}

你可以只使用char类型的字母变量并将其传递给contains和beacuse剩下的现在是List<char>你可以从中删除一个字符。

再次不要将remaining.ToString()重新分配给输入。使用string.Join就像这样

string.Join(string.empty,remaining);

正如其他人发布的那样,可能有更好的方法可以做到这一点,但我希望我在这里放置的内容可以帮助您了解出了什么问题并帮助您学习

答案 1 :(得分:0)

有很多方法可以达到这个目的,这是一个建议:

static void Main(string[] args)
{
    Func("cacten","ace");
    Func("cacten", "aced");
    Console.ReadLine();
}

static void Func(string input, string word)
{
    bool isMatch = true;
    foreach (Char s in word)
    {
        if (!input.Contains(s.ToString()))
        {

            isMatch = false;
            break;
        }
    }

    // success
    if (isMatch)
    {
        Console.WriteLine(word);
    }
    // no match
    else
    {
        Console.WriteLine("No Match");
    }

}

答案 2 :(得分:0)

对你的问题不是一个真正的答案,但对Linq做这类事总是很有趣:

static void Print(string input, string word)
{
    if (word.All(ch => input.Contains(ch) &&
        word.GroupBy(c => c)
            .All(g => g.Count() <= input.Count(c => c == g.Key))))
        Console.WriteLine(word);
}

功能编程完全是关于你想要什么而没有所有讨厌的循环,ifs和什么nots ...请注意,这段代码完成了你在头脑中所做的事情而无需痛苦地指定步骤一步一步你如何实际做到这一点:

  1. 确保word中的所有字符都在input
  2. 确保word中的所有字符最多使用input中出现的次数。
  3. 尽管如此,必须正确掌握基础知识,并将此答案作为附加信息发布。

答案 3 :(得分:0)

您还可以使用为此类方案创建的Regular Expression

bool IsMatch(string input, string word)
{
    var pattern = string.Format("\\b[{0}]+\\b", input);
    var r = new Regex(pattern);
    return r.IsMatch(word);
}

我在DotNetFiddle上为您创建了示例代码。

您可以在Regex101查看模式的功能。它有一个漂亮的&#34;解释&#34;和&#34;快速参考&#34;面板。