2015-12-27 3 views
0

Я пытаюсь создать список CheckBox, который фильтрует мою коллекцию объектов по некоторым свойствам.Несколько фильтров в коллекции с использованием LINQ

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

Этот подход требует, чтобы вы сохранили все должностные инструкции в 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; 
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; 
} 
+0

Ваш код дает ошибку 'Тяжесть \t Код \t Описание \t Проект \t Файл \t Строка \t Состояние подавления Ошибка \t CS0834 \t Выражение лямбда с телом оператора не может быть преобразовано в дерево выражений \t ' –

+0

Выполняете ли вы это в контексте структуры сущности? Код может быть сложным для преобразования этого в SQL и выполнения против базы данных. Но вы должны быть в порядке, когда запускаете это в коллекции. – PiotrWolkowski