需要在字典中检查字符串的字母

时间:2017-03-15 09:56:02

标签: c# string dictionary

所以我有一本字典,需要检查每个键条目,看它是否包含字符串中的一系列字母(让我们称之为LETTERS)。如果密钥中有任何字母没有LETTERS,或者它的字母多于LETTERS,则必须将其删除。(事先不知道字母) 这是涉及的代码

Dictionary<string, int> wordHolder = new Dictionary<string, int>();
string LETTERS = Console.ReadLine();

for (int i = 0; i < LETTERS.Count(); i++)
{
    for (int j = 0; j < wordHolder.Count; j++)
    {

    }
}

2 个答案:

答案 0 :(得分:0)

假设您要返回任何KeyValuePair,其中Key包含LETTERS中的所有字母。

看起来像这样:

 // Assuming 
 // Dictionary<string, int> wordHolder = new Dictionary<string, int>();  // Something
 // string LETTERS = ""; // Something

 List<char> listLettersToHave = LETTERS.ToList();
 Dictionary<string, int> researchResult = new Dictionary<string, int>();
 foreach (KeyValuePair<string, int> pair in wordHolder)
 {
     List<char> listLettersYouHave = pair.Key.ToList();
     bool ok = true;

     // If not the same count go to next KeyValuePair
     if (listLettersToHave.Count != listLettersYouHave.Count)
         continue;

     foreach (char toCheck in listLettersToHave)
     {
         // Search first occurence
         if (!listLettersYouHave.Contains(toCheck))
         {
             ok = false;
             break;
         }

         // Remove first occurence
         listLettersYouHave.Remove(toCheck);
     }

     if (ok)
         // If all letters contained then Add to result
         researchResult.Add(pair.Key, pair.Value);
 }

 // if it's a function
 // return researchResult;

这是一个例子,你可以改进它,但想法就在这里。

编辑: 如果字典包含密钥:abccbdadca 输入bac 结果密钥为:abc

解决方案区分大小写,但.ToUpper()将解决问题。

使用上一个示例,如果您希望cbda匹配,则可以取消对Count的检查。

答案 1 :(得分:0)

如果您还需要答案,我想我现在已经有了

以下有5个键...其中3个不能从“LETTERS”的内容创建。

 Dictionary<string, int> wordHolder = new Dictionary<string, int>();
            wordHolder.Add("CEFBA",1);
            wordHolder.Add("ZDFEEG",2);
            wordHolder.Add("TYHRFG", 3);
            wordHolder.Add("FFFFBBDD", 4);
            wordHolder.Add("PCDATTY", 5);

            var keysToRemove = new List<string>();

            string myLetters = "ABCDEF";

            var myLettersArray = myLetters.ToCharArray();

            foreach (var keyToCheck in wordHolder)
            {
                var keyCannotBeCreatedFromLetters = false;
                var keyArray = keyToCheck.Key.ToCharArray();

                foreach (var letterExists in 
                            from keyLetterToCheck in keyArray 
                                where !keyCannotBeCreatedFromLetters 
                                    select myLettersArray.Any(a => a == keyLetterToCheck) 
                                        into letterExists 
                                            where !letterExists select letterExists)
                {
                    keysToRemove.Add(keyToCheck.Key);
                    keyCannotBeCreatedFromLetters = true;
                }
            }

            foreach (var key in keysToRemove)
            {
                wordHolder.Remove(key);
            }

它正确地将第2,第3和第5个键标识为不可创建。

下面是相同的逻辑,但作为foreach循环。我发现这通常很有用,所以你可以看到内部发生了什么。

foreach (var keyToCheck in wordHolder)
            {
                var keyCannotBeCreatedFromLetters = false;
                var keyArray = keyToCheck.Key.ToCharArray();

                foreach (var keyLetterToCheck in keyArray)
                {
                    if (keyCannotBeCreatedFromLetters)
                        continue;

                    var letterExists = myLettersArray.Any(a => a == keyLetterToCheck);

                    if (letterExists) continue;

                    keysToRemove.Add(keyToCheck.Key);
                    keyCannotBeCreatedFromLetters = true;
                }
            }