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
控制台应该只显示 1 和 3 因为它们是唯一的 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();
}
}
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 控制台应该只显示 1 和 3 因为它们是唯一的 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();
}
}