2013-12-20 3 views
-1

Я пишу программу для фильтрации типов еды в разные категории с помощью наблюдаемой коллекции. Я использую перечисления, чтобы классифицировать питание, и у меня есть три отдельных метода с тем же кодом, чтобы разделить их на новые коллекции, когда их соответствующие кнопки будут нажаты. Три типа перечислений: вегетарианское, мясо и рыба. У меня есть две наблюдаемые коллекции, питание и фильтрация. Я пытался создать другой метод, а затем передать категорию в качестве параметра, но я не мог заставить его работать! Любая помощь будет принята с благодарностью.Попытка сократить мою программу, поэтому код не повторяется

private void btnVegetarian_Click(object sender, RoutedEventArgs e) 
    { 
     filteredMeals = new ObservableCollection<Meal>(); 
     Meal newMeal = new Meal(); 

     for (int i = 0; i < meals.Count; i++) 
     { 
      newMeal = meals[i]; 
      if (newMeal.Category == MealCategory.Vegetarian) 
      { 
       filteredMeals.Add(newMeal); 
      } 
     } 
     lbxMeals.ItemsSource = filteredMeals; 
    } 

    private void btnMeat_Click(object sender, RoutedEventArgs e) 
    { 
     filteredMeals = new ObservableCollection<Meal>(); 
     Meal newMeal = new Meal(); 

     for (int i = 0; i < meals.Count; i++) 
     { 
      newMeal = meals[i]; 
      if (newMeal.Category == MealCategory.Meat) 
      { 
       filteredMeals.Add(newMeal); 
      } 
     } 
     lbxMeals.ItemsSource = filteredMeals; 

    } 

    private void btnFish_Click(object sender, RoutedEventArgs e) 
    { 
     filteredMeals = new ObservableCollection<Meal>(); 
     Meal newMeal = new Meal(); 

     for (int i = 0; i < meals.Count; i++) 
     { 
      newMeal = meals[i]; 
      if (newMeal.Category == MealCategory.Fish) 
      { 
       filteredMeals.Add(newMeal); 
      } 
     } 
     lbxMeals.ItemsSource = filteredMeals; 
    } 
+0

Почему бы не показать метод, который не работает, что вы пробовали? – Casey

+0

Вы хотите назначить тот же ListBox во всех трех случаях? И действительно ли вы хотите создать новый ObservableCollection в каждом случае, которое вытирает предыдущий? –

ответ

7

Вам необходимо создать новый метод, принимающий параметр MealCategory. Переместите код туда и передайте соответствующую MealCategory для каждого из ваших обработчиков щелчков.

Код может выглядеть следующим образом:

private void btnVegetarian_Click(object sender, RoutedEventArgs e) 
{ 
    FilterMeals(MealCategory.Vegatarian); 
} 

private void btnMeat_Click(object sender, RoutedEventArgs e) 
{ 
    FilterMeals(MealCategory.Meat); 
} 

private void btnFish_Click(object sender, RoutedEventArgs e) 
{ 
    FilterMeals(MealCategory.Fish); 
} 

private void FilterMeals(MealCategory category) 
{ 
    filteredMeals = new ObservableCollection<Meal>(); 
    Meal newMeal = new Meal(); 

    for (int i = 0; i < meals.Count; i++) 
    { 
     newMeal = meals[i]; 
     if (newMeal.Category == category) 
     { 
      filteredMeals.Add(newMeal); 
     } 
    } 
    lbxMeals.ItemsSource = filteredMeals; 
} 

После того, как вы получили, что работает, вы можете попробовать рефакторинга ваш метод FilterMeals быть короче. Вы можете использовать LINQ, чтобы выразить фильтр, а конструктор ObservableCollection имеет перегрузку принимая IEnumerable<T>, что может упростить его:

private void FilterMeals(MealCategory category) 
{ 
    var filteredMeals = meals.Where(m => m.Category == category); 
    lbxMeals.ItemsSource = new ObservableCollection<Meal>(filteredMeals); 
} 
0
private void btnVegetarian_Click(object sender, RoutedEventArgs e) 
{ 
    Filer(MealCategory.Vegatarian).Invoke(); 
} 

private void btnMeat_Click(object sender, RoutedEventArgs e) 
{ 
    Filer(MealCategory.Meat).Invoke(); 
} 

private void btnFish_Click(object sender, RoutedEventArgs e) 
{ 
    Filer(MealCategory.Fish).Invoke(); 
} 
public Action Filer(MealCategory mealCategory) 
{ 
    lbxMeals.ItemsSource = new ObservableCollection<Meal>(meals.Where(m=>m.Category=mealCategory)) 
    } 
+0

Это не скомпилируется, так как вы ничего не возвращаете из не-void-метода. В любом случае, в чем смысл «действия» здесь? – driis

+0

Я думаю, что он означает 'public Action Filer = new Action () {mealCategory => lbxMeals.ItemsSource = ....};' –

0

слишком громоздкой. Вы можете просто сделать это:

private void btnMeat_Click(object sender, RoutedEventArgs e) 
{ 
    lbxMeals.ItemsSource = new ObservableCollection<Meal>(
           meals.Where(m => m.Category == MealCategory.Meat)); 
} 

и, конечно же, то же самое для вегетарианцев и рыб.

Смежные вопросы