2013-12-20 5 views
-1

관찰 가능한 컬렉션을 사용하여 식사 유형을 여러 카테고리로 필터링하는 프로그램을 작성하고 있습니다. 열거 형을 사용하여 식사를 분류하고 있으며 각기 다른 버튼을 클릭 할 때 같은 코드로 세 개의 별도 메소드를 새 컬렉션으로 분리했습니다. 세 가지 enum 유형은 Vegetarian, Meat 및 Fish입니다. 나는 관찰 가능한 두 가지 수집 물, 식사 및 filteredMeals을 가지고 있습니다. 다른 메서드를 만든 다음 매개 변수로 Category를 전달하려고했지만 작동하지 못했습니다! 어떤 도움이라도 대단히 감사하겠습니다.내 프로그램을 줄이기 위해 코드를 반복하지 않으려 고합니다

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 = 새로운 액션 () {mealCategory => lbxMeals.ItemsSource = ....}'를 의미한다고 생각한다. –

0

너무 복잡합니다. 당신은 단순히 이것을 할 수 있습니다 :

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

물론 채식주의 자와 물고기에 대해서도 동일합니다.

관련 문제