如何将用户输入注册到列表C#

时间:2016-11-23 10:08:05

标签: c#

您好我试图让用户制作一个单词列表。下一步是用户再次键入其中一个单词,然后程序将检查列表中的字谜。我找到了一种方法来解决它,但只有在检查我自己的列表时。 我想知道如何做我需要的。不需要精确的代码,只需要一些帮助。 C#和编码仍然很新。别介意瑞典的评论。

static void Main(string[] args)
    {
        Console.WriteLine("Skriv lite olika ord:");
        string[] words = Console.ReadLine().Split(null);
        Console.WriteLine("Tackar! Välj ett av orden för att kolla ifall det finns Anagram ordet:");
        string[] word = Console.ReadLine().Split(null);

        List<string> result = new List<string>();
        bool match = false;


        for (int i = 0; i < words.Length; i++)
            words[i] = words[i].Trim();

        //Loopar igenom alla ord i arrayen, börjar med första ordet.
        for (int i = 0; i < words.Length - 1; i++)
        {
            result.Add(words[i]);
            //Loopar igenom arrays med nästkommande ord.
            for (int c = 2; c < words.Length; c++)
            {
               //Gämför bara ifall orden har lika många bokstäver och struntar i "tomma" ord
                if(words[i].Length == words[c].Length && words[i] !="")
                {
                    //Konverterar orden till CharArray
                    char[] a = words[i].ToUpper().ToCharArray();
                    char[] b = words[c].ToUpper().ToCharArray();
                    //Soreterar orden i bokstavsordning
                    Array.Sort(a);
                    Array.Sort(b);

                    match = false;
                    //sätter en counter för att kunna räkna
                    int counter = 0;
                    //Loppar igen alla bokstäver i orden man jämför
                    // Om den hittar någon bokstav som inte stämmer överens så returners False.
                    // Om alla bokstäver mathar så return true.
                    foreach(char x in a)
                    {
                        if (x == b[counter])
                            match = true;
                        else
                        {
                            match = false;
                            break;
                        }
                        counter++;
                    }
                    // om alla bokstäver "matchar" så läggs de till i listan
                    // har words[c] = ""; ifall den hittar tomma strings
                    if(match)
                    {
                        result.Add(words[c]);
                        words[c] = "";
                    }
                }
            }
            // om listan bara blir 1 ord så hittas ingen match
            if (result.Count() > 1 && result[0] != "")
            {
                Console.Write("Anagrams: ");
                foreach (string s in result)
                    Console.Write(s + " ");
                Console.WriteLine();
            }
            //återställer listan
            result.Clear();
        }
        Console.ReadKey();

5 个答案:

答案 0 :(得分:2)

您的问题不是很清楚,但我怀疑您正在寻找Console.ReadLine()string.Split(),并将其合并为:

string[] words = Console.ReadLine().Split(null);

将返回由空格分隔的所有子字符串。

您应该探索其他形式的string.Split,您可以在哪里指定要拆分的字符以及从结果中删除空白条目

答案 1 :(得分:1)

这是您阅读用户输入的方式:

static void Main(string[] args)
{
    Console.WriteLine("Write a list of Words");
    string input = Console.ReadLine();
    List<string> words = input.Split(' ').ToList();
    List<string> result = new List<string>();
    bool match = false;

这应该导致:

enter image description here

答案 2 :(得分:1)

解决方案实际上非常简单 如果它们共享相同的字母,您只需要检查符合字母数量的每个单词。

E.g。 word有4个字母。如果用户输入的what有5个字母,则可能无法匹配。但如果他输入的darn也是4,你只需检查所有字母是否匹配。

我应该关注案例敏感度,我忽略了这一点,以使答案更简单 还有很多方法可以改进我遗漏的代码。一切都以简洁的名义:)

    static void Main(string[] param)
    {
        //The list of Words which are anagrams
        List<string> solutions = new List<string>();

        //get the user input
        string userInput = "User writes arm ram kola like hi"; //Replace with Console.ReadLine().ToLower(); and don't forget to prompt the userwith input

        //split it into the diffrent words
        string[] words = userInput.Split(' ');

        //get the users "match want"
        string userMatchWant = "mar"; //Replace with Console.ReadLine().ToLower(); and don't forget to prompt the userwith input

        //Find words wich are as long as mar
        foreach (string word in words)
        {
            //if they arn't the same length it can't be an anagramm
            if (word.Length != userMatchWant.Length)
                continue;

            //To Determin if all characters of the words are the same
            bool hasOnlyTheSameLetters = false;

            //now check if all characters contains
            foreach (char c in word)
            {
                //If The lette is in the word assume it contains only of the letters that we are looking for, because
                if (userMatchWant.Contains(c.ToString()))
                    hasOnlyTheSameLetters = true;
                //else we know it has a different word so we can breack and check the other input words.
                else
                {
                    hasOnlyTheSameLetters = false;
                    break;
                }                        
            }

            //if there is a diffrence in letters contine
            if (hasOnlyTheSameLetters == false)
                continue;
            //else add the word to the solution
            else
                solutions.Add(word);
        }

        //Print the solutions
        if(solutions.Count > 0)
        {
            Console.Write("Anagrams: ");
            foreach (string s in solutions)
                Console.Write( s  + " ");
            Console.WriteLine();
        }

        Console.ReadKey();
    }

对于你所有的LINQ狂热者来说,这是我能想到的最短路,替换foreach(字中的字符串) - 循环:
var totalMatches = words.Where(p => p.Length == userMatchWant.Length).Where(p => p.All(c => userMatchWant.Contains(c.ToString())));

答案 3 :(得分:0)

我建议使用词典(或查找)代替 list ,并使用相同的键对所有字谜进行分组。密钥是在单词中排序的字母(因此我们在排序&#39; r&#39;,&#39; a&#39;&#39; m&#39;之后我们有"amr"。 &#34; ram&#34;&#39;和值是初始词的集合)

  amr: {mar, arm, ram}
  egl: {Elg, gel}

实施

  private static string MakeKey(string value) {
    return string.Concat(value
      .Select(c => char.ToUpper(c)) // let's be case insensitive
      .OrderBy(c => c));
  }

  private static void AddWord(Dictionary<string, HashSet<string>> words, string word) {
    string key = MakeKey(word);

    HashSet<string> anagrams; 

    if (words.TryGetValue(key, out anagrams))
      anagrams.Add(word);
    else 
      words.Add(key, new HashSet<string>() {word});            
  }

  static void Main(string[] args)
    Dictionary<string, HashSet<string>> words = new Dictionary<string, HashSet<string>>(); 

    // Let user input all the words separating them either by spaces or by commas etc. 
    var initialWords = Console
      .ReadLine()
      .Split(new char[] { ' ', ',', ';', '\t' }, StringSplitOptions.RemoveEmptyEntries); 

    foreach (var word in initialWords) 
      AddWord(words, word);

在大字数组的情况下,字典效率更高O(N) v。O(N**2)(如果你想分析整个瑞典语词汇,那该怎么办?)。 为了获得字谜,我们应该从字典s.t中过滤出对。在Value中包含至少2个单词:

  var report = words
    .Where(pair => pair.Value.Count > 1) // at least 2 words share the same key
    .Select(pair => string.Join(", ", pair
      .Value
      .OrderBy(item => item))) // let us be nice and ordering anagrams
    .OrderBy(item => item);    // let us be nice and ordering anagrams

   Console.Write(string.Join(Environment.NewLine, report));

结果是

  arm, ram
  Elg, gel
  era, rea
  för, frö

答案 4 :(得分:0)

感谢目前为止的答案!我认为我对问题的解释有点弱。用户输入现在已修复,但最后一个问题仍然存在。 在用户输入他们的输入之后,他们会得到另一个问题&#34;在列表中键入其中一个单词以查找字谜?&#34;但我的问题是我的程序运行我的所有字谜而不是我们在第二个问题中选择的单词。 :/