简单程序询问列表中的查询数组

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

所以我使用了一个三元组,它检查StudentCardNumber 数组的长度,如果.Length &gt; 1 使用.Aggregate() 将每个数组值相乘,或者将值乘以自身。三元结果与用户输入进行比较,并在比较结果.Where() 方法过滤StudentConfig 集合。

过滤后 - 检查检索了多少元素,根据您的条件,如果只有 1 个 Student - 打印,如果没有找到或超过 1 个 - 显示错误。

所有包裹在while 中的内容都会循环,直到用户输入内容,但不是数字。

结果如下所示:

【讨论】:

以上是关于简单程序询问列表中的查询数组的主要内容,如果未能解决你的问题,请参考以下文章

字符串列表中的Linq查询字符串数组

在 Presto 中,如何检查我通过子查询获取的列表中是不是存在数组中的元素

在 python 中使用布尔列表

Java - 从列表/数组中的每个对象获取单个属性的最简单方法?

如何让 ASP.NET Core 支持绑定查询字符串中的数组

谷歌表格中是不是有办法选择单元格列表作为数组用作连接表格中的参数?