简单程序询问列表中的查询数组
Posted
技术标签:
【中文标题】简单程序询问列表中的查询数组【英文标题】:Simple program asking query Array in list 【发布时间】:2021-10-19 17:17:07 【问题描述】:我有一个关于在 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 条规则冲突,则会返回“多条记录发生”或抛出异常
谁能解决?
谢谢
【问题讨论】:
"元素卡号可以乘以输入值" - 我可以将 2, 3, 5, 10, 甚至 30 与我输入的除 0 以外的任何值相乘。即使我可以乘以 0,但它会给我 0。你确定你正确地描述了问题? 也许“4 只是 2 的因数”应该是“2 只是 4 的因数”,但这也不正确,因为 1、2 和 4 是 4 的因数。 【参考方案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
中的内容都会循环,直到用户输入内容,但不是数字。
结果如下所示:
【讨论】:
以上是关于简单程序询问列表中的查询数组的主要内容,如果未能解决你的问题,请参考以下文章
在 Presto 中,如何检查我通过子查询获取的列表中是不是存在数组中的元素
Java - 从列表/数组中的每个对象获取单个属性的最简单方法?