C # Простое отображение консольного приложения / логическая проблема - PullRequest
0 голосов
/ 28 августа 2018
        List<int> numberList = new List<int>();
        List<int> uniqueList = new List<int>();

        string input;
        int number = 0;
        bool over = false;

        while (!over)
        {
            input = Console.ReadLine();
            if (input == "quit")
            {
                over = true;
                break;
            }
            if (int.TryParse(input, out number))
            {
                numberList.Add(number);
            }
        }

        for (int i = 0; i < numberList.Count; i++)
        {
            if (!uniqueList.Contains(number))
            {
                uniqueList.Add(number);
            }
        }

        for (int i = 0; i < uniqueList.Count; i++)
        {
            Console.WriteLine(uniqueList[i]);
        }

        Console.ReadKey();

Привет! Мне нужна помощь с этой программой, которая принимает числа, но после ввода «quit» она должна перечислить все уникальные числа, которые были введены.

Например, вот входные данные: 5, 5, 5, 2, 2, 1, 3 Консоль должна отображать только 1 и 3 , поскольку они являются единственными уникальными числами.

Проблема в том, что программа в ее текущей форме отображает только последний введенный уникальный номер, а не все, и я не знаю почему.

Не могли бы вы сказать мне, почему? Что мне нужно сделать, чтобы перечислить их все?

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Это полная реализация решения:

using System;
using System.Collections.Generic;
using System.Linq;

namespace EntryPoint.Concole
{
    class Program
    {
        static void Main(string[] args)
        {
           List<int> numberList = new List<int>();
           List<int> uniqueList = new List<int>();

           string input;
           int number = 0;
           bool over = false;

           while (!over)
           {
               input = Console.ReadLine();
               if (input == "quit")
               {
                  over = true;
                  break;
               }
               if (int.TryParse(input, out number))
               {
                  numberList.Add(number);
               }
           }

           var numbersDistinct = numberList.GroupBy(i => i);

           foreach (var num in numbersDistinct)
           {
              if (num.Count() == 1)
              {
                  uniqueList.Add(num.Key);
              }
           }

           for (int i = 0; i < uniqueList.Count; i++)
           {
              Console.WriteLine(uniqueList[i]);
           }

           Console.ReadKey();
        }
    }
0 голосов
/ 28 августа 2018

Я проверил и исправил ваш код. Хотя это не идеально, но я указал на основные ошибки.

        List<int> numberList = new List<int>();
        List<int> uniqueList = new List<int>();

        string input;
        int number = 0;
        bool over = false;

        while (!over)
        {
            input = Console.ReadLine();
            if (input == "quit")
            {
                over = true;
                //break; // it is not needed since you have over = true
            }
            if (int.TryParse(input, out number))
            {
                numberList.Add(number);
            }
        }

        for (int i = 0; i < numberList.Count; i++)
        {
            //if (!uniqueList.Contains(number)) // this is the wrong line
            if (numberList.Count(q => q == numberList[i]) == 1)
            {
                //uniqueList.Add(number); // this is also wrong
                uniqueList.Add(numberList[i]);
            }
        }

        for (int i = 0; i < uniqueList.Count; i++)
        {
            Console.WriteLine(uniqueList[i]);
        }

        Console.ReadKey();

Проще говоря, метод Count (...) в

numberList.Count (q => q == numberList [i]) == 1

строка просто подсчитывает элементы из numberList, которые удовлетворяют предоставленному условию. В этом случае условие q == numberList [i] что в основном означает считать элементы, которые равны numberList [i].

Вы также можете прочитать о делегатах и ​​лямбда-выражениях в C # для лучшего понимания.

0 голосов
/ 28 августа 2018

Вам нужно использовать словарь, чтобы записать счетчик каждого числа, а затем вернуть уникальные:

    Dictionary<int, int> numberDictionary = new Dictionary<int, int>();

    string input;
    int number = 0;
    bool over = false;

    while (!over)
    {
        input = Console.ReadLine();
        if (input == "quit")
        {
            over = true;
            break;
        }
        if (int.TryParse(input, out number))
        {
            if (numberDictionary.TryGetValue(number), out int count)
            {
                numberDictionary[number] = count + 1;
            }
            else
            {
                numberDictionary.Add(number, 1);
            } 
        }
    }

    foreach(var item in numberDictionary)
    {
        if (item.Value == 1)
        Console.WriteLine(item.Key);
    }

    Console.ReadKey();
0 голосов
/ 28 августа 2018

Вы можете сделать это намного проще

List<int> numbers = new List<int>{1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6};
var unique = numbers.Where(n => numbers.Count(m => m == n) == 1);
foreach(var u in unique)
    WriteLine(u);

Печать

1

5

Что он делает, так это назначает номера списка, и он просматривает каждого члена в списке (в данном случае этот член называется n).

Затем проверяется, равно ли число вхождений n 1. Если это так, оно должно быть уникальным.

Итак, для первого числа в нашем списке 1, следующее:

numbers.Count(m => m == n)

Вернет 1.

Когда n равно 2, тогда

numbers.Count(m => m == n)

Вернет 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...