首页 > 解决方案 > 简单程序询问列表中的查询数组

问题描述

我有一个关于在 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 条以上规则冲突,则返回“多条记录发生”或抛出异常

任何人都可以解决它吗?

谢谢

标签: c#arrayslinq

解决方案


我不确定您是否正确描述了问题,但在以下情况下:

// 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循环中,直到用户输入一些东西,但不是数字。

结果如下所示: 在此处输入图像描述


推荐阅读