C# 简单控制台应用程序 displaying/logical 问题

C# Simple console application displaying/logical issue

        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" 后,它应该列出所有已输入的 unique 数字。

例如这里的输入:5, 5, 5, 2, 2, 1, 3 控制台应该只显示 13 因为它们是唯一的 unique 数字。

问题是,当前形式的程序只显示最后输入的唯一编号,而不是所有编号,我不知道为什么。

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

你可以做得更简单

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)

会return1.

n为2时

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

会return2.

我已经检查并修复了您的代码。虽然还不完美,但我已经指出了关键的错误。

        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

line 仅计算 numberList 中满足提供条件的元素。在这种情况下,条件是 q == 数字列表[i] 这基本上意味着计算等于 numberList[i].

的元素

您还可以阅读有关 C# 中的委托和 lambda 表达式的内容,以便更好地理解。

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

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

这是解决方案的完整实施:

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