2013-03-14 48 views
0

我有一個需要篩選的ID列表,這取決於3個下拉框中選擇的值。我得到了它2個下拉菜單中工作,但可以看到,這是不完成它的最佳方式:使用3個下拉列表篩選IEnumerable

var nodesList = new List<int>(); 

       // Check each item in search output against the values in the dropdown boxes 
       bool found = false; 

       foreach (var item in searchOutput) // searchOut is an IEnumerable 
       { 
        // This is where I need to add another dropdown box option but realise the code below is going to get even messier !! 

        if (GetNodeProperty(item.Id, "sportChooser", "sportChooser").Contains(ddlSport.SelectedValue)) 
        { 
         if (ddlCategory.SelectedIndex == 0 || GetNodeProperty(item.Id, "categoryChooser", "categoryChooser").Contains(ddlCategory.SelectedValue)) 
         { 
          found = true; 
         } 
        } 

        if (GetNodeProperty(item.Id, "categoryChooser", "categoryChooser").Contains(ddlCategory.SelectedValue)) 
        { 
         if (ddlSport.SelectedIndex == 0 || GetNodeProperty(item.Id, "sportChooser", "sportChooser").Contains(ddlSport.SelectedValue)) 
         { 
          found = true; 
         } 
        } 

        if (found) 
        { 
         nodesList.Add(item.Id); 
         found = false; 
        } 

       } 

       lvSearchResult.DataSource = nodesList; 
       lvSearchResult.DataBind(); 
      } 

我假定某種形式的Lambda表達式的會更適合,但對我的生活不能似乎得到它的工作。這是我到目前爲止有:

foreach (var item in searchOutput) 
       { 
        nodesList.Add(item.Id); 
       } 
       List<int> filteredNodes = nodesList 
        .Where(
         x => 
         GetNodeProperty(Convert.ToInt32(x.ToString()), "categoryChooser", "categoryChooser").Contains(ddlCategory.SelectedValue)) 
        .Where(
         x => 
         GetNodeProperty(Convert.ToInt32(x.ToString()), "sportChooser", "sportChooser").Contains(ddlSport.SelectedValue)) 
        .ToList(); 

注:我需要用3個下拉菜單的組合東西是否已經選擇或不過濾searchOutput。

回答

0

Grrr,你爲什麼在上市後解決這些事情!

// Check each item in search output against the values in the dropdown boxes 
      foreach (var item in searchOutput) 
      { 
       nodesList.Add(item.Id); 
      } 

      List<int> filteredNodes = nodesList 
       .Where(
        x => 
        ((ddlCategory.SelectedIndex == 0 || GetNodeProperty(Convert.ToInt32(x.ToString()), "categoryChooser", "categoryChooser").Contains(ddlCategory.SelectedValue)) && (ddlSport.SelectedIndex == 0 || GetNodeProperty(Convert.ToInt32(x.ToString()), "sportChooser", "sportChooser").Contains(ddlSport.SelectedValue))) && (ddlFileType.SelectedIndex == 0 || ContentType(Convert.ToInt32(x.ToString())) == ddlFileType.SelectedValue.ToLower())) 
       .ToList(); 

      lvSearchResult.DataSource = filteredNodes; 
      lvSearchResult.DataBind();