使用 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 时,程序就会崩溃并给我们以下错误:
其他信息:对象引用未设置为实例 对象。 如果存在此异常的处理程序,则程序可能是安全的 继续。
请帮忙!
当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
};
}
}