我创建这个表格来生成学生的列表,包括由一些标准筛选(在左侧)和显示所需的任何信息(从右侧)
如何使用多个条件和LINQ过滤列表中的数据?
的能力当窗体在初始化开始我抓住了整个学生名单与Entity Framework
List<Student> students = await context.Students.ToListAsync().ConfigureAwait(false);
而且我把它保存到两个列表:
private List<Student> _listOfAllStudents = new List<Student>();
private List<Student> _filteredStudents = new List<Student>();
然后我对名单进行我的逻辑是这样的:
private void PrepareFilteredStudentListAccordingToFilterCheckedBoxes()
{
_filteredStudents = _listOfAllStudents;
if (ColonieFilterCheckBox.Checked)
{
_filteredStudents = _filteredStudents.Intersect(_listOfAllStudents.Where(x => x.Colonie).Select(x => x).ToList()).ToList();
}
if (NatationFilterCheckBox.Checked)
{
_filteredStudents = _filteredStudents.Intersect(_listOfAllStudents.Where(x => x.Nataion).Select(x => x).ToList()).ToList();
}
if (ExcursionFilterCheckBox.Checked)
{
_filteredStudents = _filteredStudents.Intersect(_listOfAllStudents.Where(x => x.Excursion).Select(x => x).ToList()).ToList();
}
//Rest of the code is omitted but you get the idea...
}
同样的逻辑也正在根据显示复选框完成:
private void FillDataGridViewWithFilteredStudentAccordingToDisplayCheckBoxes()
{
FilteredStudentDataGridView.Columns.Add("Id", "Numero");
FilteredStudentDataGridView.Columns.Add("LastName", "Nom");
FilteredStudentDataGridView.Columns.Add("FirstName", "Prenom");
if (MiddleNameDisplayCheckBox.Checked)
{
FilteredStudentDataGridView.Columns.Add("MiddleName", "Nom Du Pere");
}
if (BirthdayDateDisplayCheckBox.Checked)
{
FilteredStudentDataGridView.Columns.Add("DateOfBirth", "Date De Naissance");
}
//Rest of the code omitted, but same concept.
foreach (Student student in _filteredStudents)
{
List<object> rowsValues = new List<object>();
foreach (object column in FilteredStudentDataGridView.Columns)
{
string columnName = ((DataGridViewTextBoxColumn)column).Name;
if (columnName == "Id")
{
rowsValues.Add(student.StudentId);
}
if (columnName == "FirstName")
{
rowsValues.Add(student.FirstName);
}
//Code omitted.
}
object[] arrayRowsValues = rowsValues.ToArray();
FilteredStudentDataGridView.Rows.Add(arrayRowsValues);
}
}
我在想,如果有使用LINQ
,而不是方法所有这些if
块根据我的条件筛选数据?
假设'x.Colonie'和其他的是bools这可以工作'Where(x =>(x.Colonie && ColonieFilterCheckBox.Checked)&&/* other conditions * /)'等 – JSteward
请注意'.Select x => x)'是一个空操作,不需要。此外,不应该需要内部的'.ToList()',因为'Intersect'带有'IEnumerable'。真的,你需要的只是'_filteredStudents = _filteredStudents.Where(x => x.Excursion).ToList();'。 – NetMage
@JSteward不是所有的都是'bool',但是我可以通过检查'!string.IsNullOrWhiteSpace'来做到这一点,因为我不让它们插入空字符串的数据。 –