使用LINQ对集合上的多个过滤器

时间:2015-12-27 00:32:00

标签: c# linq

我正在尝试创建一个CheckBox列表,通过它的一些属性来过滤我的对象集合。

enter image description here

我正在试图找出如何执行最后一个按钮,该按钮将根据其作业描述属性(字符串)过滤员工列表。

现在它看起来像这样

    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;
    }

构建此类过滤的最佳方法是什么?

2 个答案:

答案 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;