我正在尝试创建一个CheckBox列表,通过它的一些属性来过滤我的对象集合。
我正在试图找出如何执行最后一个按钮,该按钮将根据其作业描述属性(字符串)过滤员工列表。
现在它看起来像这样
private void ApplyFilters_Click(object sender, EventArgs e)
{
List<string> FunctieFilters = new List<string>();
foreach (var item in checkedListBox1.CheckedItems)
{
FunctieFilters.Add(item.ToString());
}
}
这为我提供了list<string>
中选定的职位描述。
我想用混合代码/伪代码描绘我想要实现的目标。
public string FilterJobDescription(List<string> descriptions)
{
string res = "";
var queryResult = from w in Werknemerlijst
where w.functie == // any of the selected job descriptions
orderby w.Naam
select w;
foreach (var w in queryResult)
{
res += w.ToString() + Environment.NewLine;
}
res+= Environment.NewLine + Environment.NewLine;
return res;
}
构建此类过滤的最佳方法是什么?
答案 0 :(得分:2)
您的过滤方法可以构建一个谓词列表,您将用它来过滤员工:
var filters = new List<Func<Employee, bool>>();
如果它们有效,您可以继续添加适当的条件。因此,例如,如果您按名称过滤员工,则可以检查名称文本框是否具有任何值。如果是这样,请在列表中添加适当的过滤器:
if (!string.IsNullOrWhiteSpace(nameTextBox.Text))
{
filters.Add(emp => emp.Name == nameTextBox.Text);
}
根据您的字段,您可以继续将过滤器添加到列表中。最后,您应用全部或任何过滤器来过滤员工:
var filteredOutEmployees = employees.Where(e =>
{
return filters.All(f => f(e));
});
最终方法可能如下所示:
private IEnumerable<Employee> ApplyFilters()
{
var filters = new List<Func<Employee, bool>>();
if (!string.IsNullOrWhiteSpace(nameTextBox.Text))
{
filters.Add(emp => emp.Name == nameTextBox.Text);
}
int age;
if (int.TryParse(ageTextBox.Text, out age))
{
filters.Add(emp => emp.Age > age);
}
int id;
if (int.TryParse(idTextBox.Text, out id))
{
filters.Add(emp => emp.Id > id);
}
// Use this to find employees that fulfil any condition
// var filteredOutEmployees = employees.Where(e =>
// {
// return filters.Any(f => f(e));
// });
// Use this to select the emplyees that fulfil all the conditions
var filteredOutEmployees = employees.Where(e =>
{
return filters.All(f => f(e));
});
return filteredOutEmployees;
}
答案 1 :(得分:-2)
此方法要求您事先将所有职务说明存储在List<T>
中。
Werknemerlijist
.Where(JobDescriptions.Contains(w.functie))
.OrderBy(w.Naam)
.Select(w)
.ForEach(w =>
{
res += w.ToString() + Environment.NewLine;
});
return res += Environment.Newline + Environment.NewLine;