繁体   English   中英

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

[英]C# Method to Check if a String Contains Certain Letters

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

并非所有来自“input”的字母都必须在“word”中——例如,对于 input = “cacten” 和 word = “ace”,word 会被打印出来,但如果 word = “aced” 则不会。

但是,当我运行该程序时,它产生了意想不到的结果(单词比“input”长,包含“input”中没有的字母),并且以多种方式对解决方案进行了编码,结果都相同。 这让我难住了好几个小时,我无法弄清楚出了什么问题。 任何和所有帮助将不胜感激,谢谢。 我的方法的完整代码写在下面。

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

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

首先,当您将remaining.ToString()分配给您的输入变量时。 你实际分配的是这个System.Collections.Generic.List1[System.String] 在 List 上执行 ToString 只会为您提供它的列表类型。 它不会将您所有的角色都备份起来。 这可能是引起您问题的主要因素。

此外,您将所有内容强制转换为字符串类型,实际上您不需要很多时间,因为字符串已经实现了 IEnumerable,您只需执行myString.ToList()就可以将字符串作为字符列表获取,所以没有必要为此:

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

像 string.Contains 之类的东西有重载的字符,所以不需要在这里制作字符串:

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

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

您可以只使用 char 类型的字母变量并将其传递给 contains ,因为现在剩余的是List<char>您可以从中删除一个字符。

再次不要将剩余的.ToString() 重新分配回输入。 像这样使用 string.Join

string.Join(string.empty,remaining);

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

您还可以使用为此类场景创建的正则表达式

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 上检查该模式的作用 它有一个漂亮的“解释”和“快速参考”面板。

有很多方法可以实现这一点,这里有一个建议:

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

}

不是你问题的真正答案,但用 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);
}

函数式编程就是关于你想要什么,没有所有讨厌的循环,如果和什么不是......请注意,这段代码完成了你在头脑中所做的事情,而无需痛苦地一步一步地指定你实际如何做:

  1. 确保word中的所有字符都在input
  2. 确保word中的所有字符的使用次数最多与input中出现的次数相同。

尽管如此,必须正确掌握基础知识,将此答案作为附加信息发布。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM