我尝试在 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() 可以获得更好的性能。