我創建這個表格來生成學生的列表,包括由一些標準篩選(在左側)和顯示所需的任何信息(從右側)
如何使用多個條件和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'來做到這一點,因爲我不讓它們插入空字符串的數據。 –