c# - 简单程序询问列表中的查询数组
问题描述
我有一个关于在 C# 编程中使用 linq 查询列表的小程序。
是类
public class Student
{
public string studentname { get; set; }
public int[] CardNumber { get; set; }
}
这就是我创建静态列表的方式
public static IList<Student> StudentConfig = new List<Student>
{
new() { studentname="Peter", CardNumber= new int[] {2 } },
new() { studentname= "Winnie" , CardNumber= new int[] {3} },
new() { studentname = "Gilbert", CardNumber = new int[] { 2,3} }
};
挑战是基于简单的配置编写一个简单的函数来找出哪个学生的名字。元素卡号可以乘以输入值。
如下所示的函数:
public static string MultiplyListCheckUp (int InputValue)
{
// For example InputValue : 4 , then return studentname="Peter" , as 4 is only factor of 2
// For example InputValue : 9 , then return studentname="Winnie" , as 9 is only factor of 3
// For example InputValue : 6 , then return studentname="Gilbert", as 6 is factor of 2 and 3
return string.Empty;
}
关于 studentconfig 可以调整。例如,我们可以添加新记录
studentname = "Sally", CardNumber = new int[] { 2,5}
如果输入值:10,它将返回 Sally
但是,如果输入值 : 30 与 1 条以上规则冲突,则返回“多条记录发生”或抛出异常
任何人都可以解决它吗?
谢谢
解决方案
我不确定您是否正确描述了问题,但在以下情况下:
// For example:
// if inputValue 4, then return "Peter"
// if inputValue 9, then return "Winnie"
// if inputValue 6, then return "Gilbert"
// if inputValue 10, then return "Sally"
// otherwise - show error or throw exception
这个例子应该工作:
public class Student
{
public string Name { get; set; }
public int[] CardNumber { get; set; }
}
class Program
{
public static IList<Student> StudentConfig = new List<Student>
{
new() { Name="Peter", CardNumber = new int[] { 2 } },
new() { Name= "Winnie" , CardNumber = new int[] { 3 } },
new() { Name = "Gilbert", CardNumber = new int[] { 2, 3 } },
new() { Name = "Sally", CardNumber = new int[] { 2, 5 } },
new() { Name = "Bob", CardNumber = new int[] { 3, 6, 8 } },
new() { Name = "Jack", CardNumber = new int[] { 5, 7, 12 } }
};
static void Main()
{
Console.WriteLine("- Students by CardNumber selector -\n");
while (true)
{
Console.Write("Your input: ");
if (!int.TryParse(Console.ReadLine(), out var inputNumber))
{
Console.Write("Invalid number was inputed. Want to try again? (Y/N): ");
if (Console.ReadLine().ToUpper() != "Y")
break;
else
continue;
}
var foundedStudents = StudentConfig.Where(student => (student.CardNumber.Length > 1
? student.CardNumber.Aggregate(1, (a, b) => a * b)
: student.CardNumber[0] * student.CardNumber[0])
== inputNumber);
var count = foundedStudents.Count();
switch (count)
{
case 1:
Console.WriteLine("Founded Student: " + foundedStudents.First().Name);
break;
case 0:
Console.WriteLine("There are no records at result with provided number");
break;
case > 1:
Console.WriteLine("There are multiple records at result with provided number");
break;
default:
Console.WriteLine("How it is possible to get here?");
break;
}
}
Console.WriteLine("\nProgram complete. Press any key to close console...");
Console.ReadKey();
}
}
Student
所以我使用了一个三元组,它检查'数组的长度,如果使用或乘以自身的值,CardNumber
则将每个数组值相乘。三元结果与用户的输入进行比较,并在比较结果方法上过滤集合。.Length > 1
.Aggregate()
.Where()
StudentConfig
过滤后 - 检查检索了多少元素,根据您的条件,如果只有 1 个Student
- 打印,如果没有找到或超过 1 个 - 显示错误。
所有这些都包裹在while
循环中,直到用户输入一些东西,但不是数字。
推荐阅读
- php - 如何在 PHP 中将 JSON Child 的位置更改为 Parent?
- spring-data-redis - 如何从客户端配置 Redis-server 的内存设置
- javascript - 如何将父容器的水平滚动位置移向其最近中心的子元素之一?
- python - 需要一个类似字节的对象,而不是 'str' f.write(image_url)
- javascript - 尝试删除空单元格时js应用程序的不稳定行为
- python - 用python替换`.doc`文件中的短语
- c - C: Scanf 在类型不匹配中被忽略
- ruby-on-rails - 音频文件没有在 Rails 上播放 Ruby
- c# - $http 没有为 Umbraco Angular 定义
- php - Laravel 迁移未显示在 phpmyadmin 中