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 ,因为它们是唯一的唯一数字。
问题在于,该程序以其当前形式仅显示已输入的最后一个唯一编号,而不是全部,而且我也不知道为什么。
你能告诉我为什么吗?我需要怎么做才能列出所有这些?
答案 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表达式的信息。