使用 LINQ 创建搜索栏会不断崩溃

本文关键字:崩溃 搜索栏 LINQ 创建 使用 | 更新日期: 2023-09-27 18:14:48

private Employee searchForEmployee(int ID)
{
    var EmployeeDetails = (from emp in EmployeeArray
                           where emp.m_EmployeeId == ID
                           select emp).FirstOrDefault();
    if (EmployeeDetails != null)
    {
        return EmployeeDetails;
    }
    else
    {
        return null;
    }
}

问题(抱歉格式不好,我是这个和 Linq 的新手(:

当 ID 匹配时,

我们似乎获得了所有信息,但是当没有匹配的 ID 时,程序就会崩溃并给我们以下错误:

其他信息:对象引用未设置为实例 对象。 如果存在此异常的处理程序,则程序可能是安全的 继续。

请帮忙!

使用 LINQ 创建搜索栏会不断崩溃

当ID匹配时,我们似乎获得了所有信息,但是 当没有匹配的ID时,程序只会崩溃并给我们 以下错误。

这是完全有道理的。给定您的代码,如果他的Id与给定Employee不匹配,则返回null 。因此,如果您这样做:

var employee = SearchForEmployee(1);
// Attempting to access the Id propery on a null value will throw.
Console.WriteLine(employee.Id); 

然后这将通过 NRE,因为返回值null .您需要在代码中添加空检查:

var employee = SearchForEmployee(1);
if (employee != null)
    Console.WriteLine(employee.Id);

或者,可以使用 C#-6 空条件运算符:

var employee = SearchForEmployee(1);
Console.WriteLine(employee?.Id);

旁注 - 您在SearchForEmployee内部的null检查是多余的,因为如果没有匹配项,您无论如何都会返回null。这将可以:

private Employee SearchForEmployee(int Id)
{
    return (from emp in EmployeeArray
    where emp.m_EmployeeId == Id
    select emp).FirstOrDefault();
}

或者再次使用 C#-6:

private Employee SearchForEmployee(int Id) => 
                            EmployeeArray.FirstOrDefault(emp => emp.m_EmployeeId == Id);

编辑

从评论:

看起来像这样:private Employee[] EmployeeArray = new Employee[50]; 它是在窗口窗体加载时创建的,并且它只是 在员工注册时初始化。我们正在使用这种方法 在添加至少一名员工之后。

好吧,您只初始化数组,而不是存储在该数组中的引用。这意味着您可能在那里初始化了一个Employee对象,但您还有另外 49 个对象没有。

您有两个选项,要么修改查询以包含null检查:

private Employee SearchForEmployee(int Id)
{
    return EmployeeArray.FirstOrDefault(emp => emp != null && emp.m_EmployeeId == Id);
}

或者,您可以改用List<Employee>,这意味着它只会包含您已经添加的员工,并且它会在您向其添加更多员工时动态调整大小,而无需您完成额外的工作。

您发布的方法不会引发错误。在代码中的某个位置,您正在调用返回 null 的方法。然后,您尝试访问它的属性之一,并且由于该对象为 null,因此会出现该错误。例如,您可能有这样的东西:

Employee emp = searchForEmployee(18);
string name = emp.Name; //This will throw an error if no employee exists with id of 18

因此,您需要先检查 emp 是否不为空:

if(emp != null)
{
    string name = emp.Name;
}

当然,我只是猜测名称是否是一个属性,但你应该明白这一点。您还可以更改方法,以便在您不想返回 null 时返回默认员工对象。像这样:

private Employee searchForEmployee(int ID)
{
    var EmployeeDetails = (from emp in EmployeeArray
                           where emp.m_EmployeeId == ID
                           select emp).FirstOrDefault();
    if (EmployeeDetails != null)
    {
        return EmployeeDetails;
    }
    else
    {
        return new Employee
        {
            ID = 0,
            Name = "default", //etc
        };
    }
}