C#简单控制台应用程序显示/逻辑问题

时间:2018-08-28 10:08:07

标签: c# list console console-application text-based

        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、3 控制台应该只显示 1 3 ,因为它们是唯一的唯一数字。

问题在于,该程序以其当前形式仅显示已输入的最后一个唯一编号,而不是全部,而且我也不知道为什么。

你能告诉我为什么吗?我需要怎么做才能列出所有这些?

4 个答案:

答案 0 :(得分:3)

您需要使用字典来记录每个数字的计数,然后返回唯一的数字:

    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();

答案 1 :(得分:1)

您可以做得更简单

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

这是在对列表编号进行takign,并在其中查看列表中的每个成员(在这种情况下,该成员称为n)。

然后检查n的出现次数是否等于1。如果是,则此次数必须是唯一的。

因此对于列表1中的第一个数字,如下:

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

将返回1。

n为2时,

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

将返回2。

答案 2 :(得分:1)

这是解决方案的完整实现:​​

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();
        }
    }

答案 3 :(得分:0)

我已经检查并修复了您的代码。尽管它并不完美,但是我指出了关键的错误。

        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#中的委托和lambda表达式的信息。