我知道有很多方法可以检查字符串是否包含某些字符,但我正试图找出一种排除重复字母的方法。
因此,例如,我们有字符串“doaurid”(用户输入的随机字母) 他们输入“爸爸”这个词,看看它是否有效
我无法找出一个简单的解决方案来检查该字符串是否有2个D和1个A. 我想到的唯一方法是使用嵌套for循环并遍历char数组中的每个元素并将使用过的字母转换为1或其他
答案 0 :(得分:3)
您可以使用:
var userInput = "doaurid";
var toCheck = "dad";
var check = toCheck.GroupBy(c=> c).ToDictionary(g => g.Key, g => g.Count());
var input = userInput.GroupBy(c=> c).ToDictionary(g => g.Key, g => g.Count());
bool validMatch = check.All(g => input.ContainsKey(g.Key) && input[g.Key] == g.Value);
仅当userInput
字符串包含toCheck
中的所有字母且完全相同的字母数时,此选项才有效。
如果输入字符串可以允许更多重复的字母(即:如果"dddoauriddd"
匹配),则可以通过以下方式进行检查:
bool validMatch = check.All(g => input.ContainsKey(g.Key) && input[g.Key] >= g.Value);
答案 1 :(得分:1)
Reed Copsey的answer是正确的。无论如何,这是LINQ
的另一种选择:
var userInput = "doaurid";
var searchWord = "dad";
var control = userInput.Where(searchWord.Contains).Count() == searchWord.Length;
答案 2 :(得分:0)
一种可能性是使用正则表达式。例如,以下代码将检测提供的字符串是否包含任何重复的字母。
var expression = new Regex(@"(?<letter>\w).*\k<letter>");
if (expression.IsMatch(userInput)) {
Console.WriteLine("Found a duplicate letter: {0}", expression.Match(userInput).Groups["letter"].Value);
}
此表达式首先匹配任何单词字符,然后将该结果存储在“letter”组中。然后它跳过0或更多其他插入字母,最后匹配“反向引用”到“字母”组中捕获的任何内容。如果字符串不包含任何重复的字母,则此正则表达式将不匹配 - 因此,如果它匹配,则表示它包含重复项,并且通过检查它在字母组中捕获的值,您至少知道其中一个重复项。 / p>
在这种情况下,它会区分大小写。如果您希望它不区分大小写,可以将RegexOptions.IgnoreCase参数传递给正则表达式的构造函数。
答案 3 :(得分:0)
另一种方法,使用ToLookup
:
var charCount = "dad".ToLookup(chr => chr);
bool allSame = charCount.All(g => g.Count() == "doaurid".Count(c => c == g.Key));
答案 4 :(得分:0)
我可以想到一个更简单的解决方案
var userInput = "dddoauriddd"; //"doaurid";
var toCheck = "dad";
var toCheckR = "";
foreach(var c in toCheck)
{
toCheckR += ".*";
}
Console.WriteLine(Regex.IsMatch(userInput, toCheckR));