我尝试在 C# 中创建一个用于过滤列表的 lambda 表达式,但当我将变量与数组中的项目进行比较时无法使其工作
I try to make a lamda expression in C# for filtering a list and can't make it work when I compare a variable to an item in an array
所以我设置了图形用户界面,这样我就有了两个主要的列表框。我仍在弄清楚这个应用程序需要什么样的 gui,所以还有另一个,但这不相关。一个列表框是您要为部门或员工检查的选项列表。另一个是部门列表。现在我有名称选项的功能来查看部门员工的姓名。我只需要知道如何过滤列表,以便在我单击提交按钮后,唯一出现的员工是所选部门的员工。我想我会为此使用 lambda 表达式,但它对我不起作用。我真的很想知道如何更好地使用 lambda 表达式,所以请只给我一个涉及使用它们的解决方案。如果这是不可能的,或者做其他事情会更有效率,请告诉我。
读取文件并将部门数组设置为文件内容
//list of employees
public static List<Employee> EmployeeList = new List<Employee>();
//array to hold the options users have for interacting with info
public static string[] OptionsArr;
//array to hold the departments
public static string[] DeptsArr;
//skipping around same file to relevant code
//set the departments array to the contents of the depts file
DeptsArr = File.ReadAllLines("..\..\departments.txt");
不确定是否需要
填充 DeptListBox 的方法
private void UpdateDeptListBox()
{
//set up for new info
DeptListBox.Items.Clear();
//prevent interfence with update
DeptListBox.BeginUpdate();
//set department listbox to depts array
DeptListBox.DataSource = Program.DeptsArr;
DeptListBox.EndUpdate();
}
问题方法 - 提交按钮方法
List<Employee> ResultList = new List<Employee>();
//name
if (OptionsListBox.SelectedIndex == 1)
{
//user selects Marketing department
if (DeptListBox.SelectedIndex == 0)
{
//problem is either with lambda exp or Program.DeptsArr comparison
foreach (Employee empl in Program.EmployeeList.Where(empl => empl.Dept.CompareTo(Program.DeptsArr[0]) == 0).ToList())
{
//this doesn't happen
ResultList.Add(empl);
}
for (int i = 0; i<ResultList.Count; i++)
{
ResultListBox.Items.Add(ResultList[i].Lname + " " + ResultList[i].Fname + " " + ResultList[i].Dept);
}
}
}
}
如果你想测试一个特定的值是否在一个数组中,那么你可以在那个数组上调用 Contains
,例如
var allEmployees = new List<Employee>();
// Populate allEmployees here.
var selectedEmployees = allEmployees.Where(e => selectedDepartments.Contains(e.Department)).ToArray();
selectedEmployees
数组将仅包含 allEmployees
列表中的 Employee
个对象,Department
属性 值包含在 selectedDepartments
array/collection.
对我来说,当我遇到问题时将内容分解并查看更小的部分可能会有所帮助。您确定问题出在您的 lambda 函数上吗?可能是您的选项列表框 != 1 或数据未正确读取。
据我所知,这部分 应该 有效。虽然它有一些问题:
foreach (Employee empl in Program.EmployeeList.Where(empl =>empl.Dept.CompareTo(Program.DeptsArr[0]) == 0).ToList())
{
//this doesn't happen
ResultList.Add(empl);
}
您可以只从 Employee lambda 函数开始,然后对值进行硬编码。也许像这样确实产生了正确的结果(Bob 和 Brandon)
List<Employee> ResultList = new List<Employee>();
List<Employee> EmployeeList = new List<Employee> {
new Employee{ Name = "Bob", Dept = "Accounting" },
new Employee{ Name = "Larry", Dept = "A" },
new Employee{ Name = "Margret", Dept = "B" },
new Employee{ Name = "Brandon", Dept = "Accounting" }
};
string[] DeptsArr = new string[2];
DeptsArr[0] = "Accounting";
DeptsArr[1] = "A";
//user selects Marketing department
if (departmentIndex == 0)
{
foreach (Employee empl in EmployeeList.Where(empl => empl.Dept.CompareTo(DeptsArr[0]) == 0).ToList())
{
ResultList.Add(empl);
}
}
但是,您在 foreach 循环中的 lamda 函数是多余的。您可以将 lambda 函数视为 运行 foreach 循环的指令。 foreach 循环本身可能如下所示:
List<Employee> ResultList = new List<Employee>();
foreach (Employee empl in EmployeeList)
{
if(empl.Dept == DeptsArr[0])
{
ResultList.Add(empl);
}
}
通过使用以下 lamda 函数,您可以获得与上述 foreach 循环相同的结果:
List<Employee> ResultList = EmployeeList.Where(empl => empl.Dept == DeptsArr[0]).ToList();
最后要注意的是,lambda 函数末尾的“ToList()”执行循环,returns 结果作为列表。很多时候这不是必需的。如果没有“ToList()”部分,将返回一个 IEnumerable,您可以使用它来代替。在许多情况下,使用 IEnumerable 而不是调用 ToList() 可以获得更好的性能。
所以我设置了图形用户界面,这样我就有了两个主要的列表框。我仍在弄清楚这个应用程序需要什么样的 gui,所以还有另一个,但这不相关。一个列表框是您要为部门或员工检查的选项列表。另一个是部门列表。现在我有名称选项的功能来查看部门员工的姓名。我只需要知道如何过滤列表,以便在我单击提交按钮后,唯一出现的员工是所选部门的员工。我想我会为此使用 lambda 表达式,但它对我不起作用。我真的很想知道如何更好地使用 lambda 表达式,所以请只给我一个涉及使用它们的解决方案。如果这是不可能的,或者做其他事情会更有效率,请告诉我。
读取文件并将部门数组设置为文件内容
//list of employees
public static List<Employee> EmployeeList = new List<Employee>();
//array to hold the options users have for interacting with info
public static string[] OptionsArr;
//array to hold the departments
public static string[] DeptsArr;
//skipping around same file to relevant code
//set the departments array to the contents of the depts file
DeptsArr = File.ReadAllLines("..\..\departments.txt");
不确定是否需要 填充 DeptListBox 的方法
private void UpdateDeptListBox()
{
//set up for new info
DeptListBox.Items.Clear();
//prevent interfence with update
DeptListBox.BeginUpdate();
//set department listbox to depts array
DeptListBox.DataSource = Program.DeptsArr;
DeptListBox.EndUpdate();
}
问题方法 - 提交按钮方法
List<Employee> ResultList = new List<Employee>();
//name
if (OptionsListBox.SelectedIndex == 1)
{
//user selects Marketing department
if (DeptListBox.SelectedIndex == 0)
{
//problem is either with lambda exp or Program.DeptsArr comparison
foreach (Employee empl in Program.EmployeeList.Where(empl => empl.Dept.CompareTo(Program.DeptsArr[0]) == 0).ToList())
{
//this doesn't happen
ResultList.Add(empl);
}
for (int i = 0; i<ResultList.Count; i++)
{
ResultListBox.Items.Add(ResultList[i].Lname + " " + ResultList[i].Fname + " " + ResultList[i].Dept);
}
}
}
}
如果你想测试一个特定的值是否在一个数组中,那么你可以在那个数组上调用 Contains
,例如
var allEmployees = new List<Employee>();
// Populate allEmployees here.
var selectedEmployees = allEmployees.Where(e => selectedDepartments.Contains(e.Department)).ToArray();
selectedEmployees
数组将仅包含 allEmployees
列表中的 Employee
个对象,Department
属性 值包含在 selectedDepartments
array/collection.
对我来说,当我遇到问题时将内容分解并查看更小的部分可能会有所帮助。您确定问题出在您的 lambda 函数上吗?可能是您的选项列表框 != 1 或数据未正确读取。
据我所知,这部分 应该 有效。虽然它有一些问题:
foreach (Employee empl in Program.EmployeeList.Where(empl =>empl.Dept.CompareTo(Program.DeptsArr[0]) == 0).ToList())
{
//this doesn't happen
ResultList.Add(empl);
}
您可以只从 Employee lambda 函数开始,然后对值进行硬编码。也许像这样确实产生了正确的结果(Bob 和 Brandon)
List<Employee> ResultList = new List<Employee>();
List<Employee> EmployeeList = new List<Employee> {
new Employee{ Name = "Bob", Dept = "Accounting" },
new Employee{ Name = "Larry", Dept = "A" },
new Employee{ Name = "Margret", Dept = "B" },
new Employee{ Name = "Brandon", Dept = "Accounting" }
};
string[] DeptsArr = new string[2];
DeptsArr[0] = "Accounting";
DeptsArr[1] = "A";
//user selects Marketing department
if (departmentIndex == 0)
{
foreach (Employee empl in EmployeeList.Where(empl => empl.Dept.CompareTo(DeptsArr[0]) == 0).ToList())
{
ResultList.Add(empl);
}
}
但是,您在 foreach 循环中的 lamda 函数是多余的。您可以将 lambda 函数视为 运行 foreach 循环的指令。 foreach 循环本身可能如下所示:
List<Employee> ResultList = new List<Employee>();
foreach (Employee empl in EmployeeList)
{
if(empl.Dept == DeptsArr[0])
{
ResultList.Add(empl);
}
}
通过使用以下 lamda 函数,您可以获得与上述 foreach 循环相同的结果:
List<Employee> ResultList = EmployeeList.Where(empl => empl.Dept == DeptsArr[0]).ToList();
最后要注意的是,lambda 函数末尾的“ToList()”执行循环,returns 结果作为列表。很多时候这不是必需的。如果没有“ToList()”部分,将返回一个 IEnumerable,您可以使用它来代替。在许多情况下,使用 IEnumerable 而不是调用 ToList() 可以获得更好的性能。