C # Как заставить другие переменные взаимодействовать с массивом char, чтобы я мог использовать char, чтобы найти количество раз, когда появились буквы - PullRequest
0 голосов
/ 29 октября 2018

Итак, я обдумал то, что я должен изменить. Вставленный символ - это мое издание. Я создал эту программу без проблем со строкой, и теперь я должен изменить программу от подсчета количества вхождений слов до количества вхождений букв.

Я знаю, что для этого мне нужно было изменить массив на char, чтобы он представлял собой массив символов. Однако, когда я делаю это, я больше не могу сравнивать его, и если я пытаюсь изменить wordkey на var, он все равно не позволяет мне сравнивать его.

В книге, которую я читаю, говорится, что если бы я хотел сравнить символы, я мог бы просто иметь метод DisplayDictionary, получающий аргумент типа SortedDictionary<char, int> без изменений. Если бы я мог просто подтолкнуть в правильном направлении. Я уже пару дней возился с этим и, похоже, просто не могу этого понять.

class Program
{
    static void Main(string[] args)
 ***{
        //create sorted dictionary based on user input
        SortedDictionary<char, int> dictionary = CollectWords();***

       //display sorted dictionary content
       DisplayDictionary(dictionary);
    } // end main

***//created sorted dictionary from user input

private static SortedDictionary<char, int> CollectWords()
{***

    //create a new sorted dictionary
     SortedDictionary<string, int> dictionary = new SortedDictionary<string, int>();


    Console.WriteLine("Enter a string: ");
    string input = Console.ReadLine();

    //split input text into tokens
    string[] words = Regex.Split(input, @"\s");

    //processing input words
    foreach (var word in words)
    {
        string wordKey = word.ToLower();

        //if ghe dictionary contains the word
        if (dictionary.ContainsKey(wordKey))
        {
            ++dictionary[wordKey];
        }//end if
        else
            //add new word with count 1 to tge dictionary
            dictionary.Add(wordKey, 1);
    }//end foreach method

    ***return dictionary;***
}//end sorted dictionary wordKey

***//display dictionary content
private static void DisplayDictionary<K, V>(SortedDictionary<K, V> dictionary)
    {***
    Console.WriteLine("\nSorted dictionary contains:\n{0, -12}{1, -12} ", "Key: ", "Value: ");

    //generate output for each key in the sorted dictionary
    //by iterating though the Keys property with a foreach statement
    foreach (K key in dictionary.Keys)
        Console.WriteLine("{0, -12}{1, -12} ", key, dictionary[key]);

        Console.WriteLine("\nsize: {0}", dictionary.Count);

    }//end display method
}//end class

1 Ответ

0 голосов
/ 29 октября 2018

Класс String реализует IEnumerable<char>, поэтому вы можете сделать следующее:

var dictionary = new SortedDictionary<char, int>();
foreach(var ch in input)
{
    if(dictionary.ContainsKey(ch))
        dictionary[ch]++;
    else
        dictionary[ch] = 1;
}

Если вы все еще хотите повторно использовать созданную коллекцию слов, вы можете преобразовать ее в коллекцию символов следующим образом:

var chars = words.SelectMany(w => w); //then foreach(var ch in chars)...

Или, если вы хотите использовать магию LINQ, вы можете даже свести все к одной строке:

var dictionary = input.GroupBy(ch => ch).ToDictionary(ch => ch.Key, ch => ch.Count());

Обратите внимание, что в этом случае вы получаете обычный словарь, а не SortedDictionary.

...