Search code examples
c#asp.net-coremodel-view-controllerrazor-pages

Filter a List based on an array of conditions


I'm currently obtaining a set of data via an API and I display it as a table on a cshtml page

Item A Supplier Size Material
Boxes Walmart Small Cardboard
Boxes Costco Medium Cardboard
Boxes Walmart Small Plastic
Bags Target Big Leather
Bags Walmart Big Plastic

and I have 3 dropdowns each one with a catalogue corresponding to each column of my table.

Each time one of the checkboxes on my dropdowns is clicked I have to filter the table. So far my process is calling again the API to get the data then pass the selected values to my controller as an array to start applying filters with this function

for (int filterPos = 0; filterPos < filterList.Count; filterPos++)
            {
                List<StockItemsModel> filtered = model;
                if (filterPos == 0)
                {
                    if (model.FindAll(e => e.Supplier.Contains(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        filtered = filtered.FindAll(e => e.Supplier.Equals(filterList.ElementAt(filterPos)));
                        tmp = filtered;
                        continue;
                    }
                    if (model.FindAll(e => e.Size.Equals(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        filtered = filtered.FindAll(e => e.Size.Equals(filterList.ElementAt(filterPos)));
                        tmp = filtered;
                        continue;
                    }
                    if (model.FindAll(e => e.Material.Equals(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        filtered = filtered.FindAll(e => e.Material.Equals(filterList.ElementAt(filterPos)));
                        tmp = filtered;
                        continue;
                    }
                    
                }
                else
                {
                    if (tmp.FindAll(e => e.Supplier.Contains(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        tmp = tmp.FindAll(e => e.Supplier.Equals(filterList.ElementAt(filterPos)));
                        continue;
                    }
                    else if (model.FindAll(e => e.Supplier.Contains(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        filtered = filtered.FindAll(e => e.Supplier.Equals(filterList.ElementAt(filterPos)));
                        foreach (StockItemsModel item in filtered)
                        {
                            tmp.Add(item);
                        }
                        continue;
                    }
                    if (tmp.FindAll(e => e.Size.Equals(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        tmp = tmp.FindAll(e => e.Size.Equals(filterList.ElementAt(filterPos)));
                        continue;
                    }
                    else if (model.FindAll(e => e.Size.Equals(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        filtered = filtered.FindAll(e => e.Size.Equals(filterList.ElementAt(filterPos)));
                        foreach (StockItemsModel item in filtered)
                        {
                            tmp.Add(item);
                        }
                        continue;
                    }
                    if (tmp.FindAll(e => e.Material.Equals(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        tmp = tmp.FindAll(e => e.Material.Equals(filterList.ElementAt(filterPos)));
                        continue;
                    }
                    else if (model.FindAll(e => e.Material.Equals(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        filtered = filtered.FindAll(e => e.Material.Equals(filterList.ElementAt(filterPos)));
                        foreach (StockItemsModel item in filtered)
                        {
                            tmp.Add(item);
                        }
                        continue;
                    }
                }
            }

            model = tmp;

            return PartialView("_AddStockTable", model);
}

so far the first and second filters work all right, for example filtering [Plastic, Small] works like a charm and I get only two records, but for [Plastic,Small,Cardboard] then I get also two records instead of three. Any pointers on what I'm doing wrong in the process?


Solution

  • But also each column has OR logic ex size1 & (supplier1 or supplier2) & material1

    If so,for [Plastic,Small,Cardboard],you will get two records.It means Small&(Plastic or Cardboard),the result will be:

    Item A Supplier Size Material
    Boxes Walmart Small Cardboard
    Boxes Walmart Small Plastic

    You can also use the following code to filter the data.Split filterList to SupplierfilterList,SizefilterList,MaterialfilterList,and then filter the model with the lists.

    List<string> SupplierfilterList = new List<string>();
                List<string> SizefilterList = new List<string>();
                List<string> MaterialfilterList = new List<string>();
                List<StockItemsModel> filtered = model;
                for (int filterPos = 0; filterPos < filterList.Count; filterPos++) {
                    if (model.FindAll(e => e.Supplier.Contains(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        SupplierfilterList.Add(filterList.ElementAt(filterPos));
                        continue;
                    }
                    if (model.FindAll(e => e.Size.Equals(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        SizefilterList.Add(filterList.ElementAt(filterPos));
                        continue;
                    }
                    if (model.FindAll(e => e.Material.Equals(filterList.ElementAt(filterPos))).Count > 0)
                    {
                        MaterialfilterList.Add(filterList.ElementAt(filterPos));
                        continue;
                    }
                }
                if (SupplierfilterList.Count > 0) {
                    filtered = filtered.FindAll(e => new[] { e.Supplier }.Any(SupplierfilterList.Contains));
                }
                if (SizefilterList.Count > 0)
                {
                    filtered = filtered.FindAll(e => new[] { e.Size }.Any(SizefilterList.Contains));
                }
                if (MaterialfilterList.Count > 0)
                {
                    filtered = filtered.FindAll(e => new[] { e.Material }.Any(MaterialfilterList.Contains));
                }