private void UpdateMatchedShirtSizeCount(SearchResults results, Shirt shirt) { results.SizeCounts.Single(x => x.Size == shirt.Size).Count += 1; }
private void UpdateMatchedShirtColorCount(SearchResults results, Shirt shirt) { results.ColorCounts.Single(x => x.Color == shirt.Color).Count += 1; }
public SearchResults Search(SearchOptions options) { var searchResults = new SearchResults { SizeCounts = new List <SizeCount>(), ColorCounts = new List <ColorCount>(), }; foreach (var size in Size.All) { searchResults.SizeCounts.Add(new SizeCount { Size = size }); } foreach (var color in Color.All) { searchResults.ColorCounts.Add(new ColorCount { Color = color }); } var matches = new Dictionary <Guid, Shirt>(); // Find results where colour & size options are specified foreach (var optionsColor in options.Colors) { foreach (var optionsSize in options.Sizes) { foreach (var shirt in _lookup[optionsSize][optionsColor]) { matches[shirt.Id] = shirt; searchResults.SizeCounts.Single(x => Equals(x.Size, optionsSize)).Count++; searchResults.ColorCounts.Single(x => Equals(x.Color, optionsColor)).Count++; } } } // Find results where only colour options are specified if (!options.Sizes.Any()) { foreach (var optionsColor in options.Colors) { foreach (var shirt in _colourLookup[optionsColor]) { matches[shirt.Id] = shirt; searchResults.ColorCounts.Single(x => Equals(x.Color, optionsColor)).Count++; } } } // Find results where only size options are specified if (!options.Colors.Any()) { foreach (var optionsSize in options.Sizes) { foreach (var shirt in _sizeLookup[optionsSize]) { matches[shirt.Id] = shirt; searchResults.SizeCounts.Single(x => Equals(x.Size, optionsSize)).Count++; } } } searchResults.Shirts = matches.Values.ToList(); return(searchResults); }
/// <summary> /// Another searching method based on 'for statement' and dealing with the lists as simple arrays without using any predicates /// </summary> /// <param name="options"></param> /// <returns></returns> public SearchResults Search_2(SearchOptions options) { //TODO: search logic goes here. if (options.Colors.Count == 0 && options.Sizes.Count != 0) { for (int shirtIndex = 0; shirtIndex < options.Sizes.Count; shirtIndex++) { foreach (var shirt in _shirts) { if (options.Sizes[shirtIndex].Name.Equals(shirt.Size.Name)) { ShirtsFound.Add(shirt); ClCounts[ColorsIndex[shirt.Color.Name]].Count++; SzCounts[SizesIndex[shirt.Size.Name]].Count++; } } } } else if (options.Sizes.Count == 0 && options.Colors.Count != 0) { for (int shirtIndex = 0; shirtIndex < options.Colors.Count; shirtIndex++) { foreach (var shirt in _shirts) { if (options.Colors[shirtIndex].Name.Equals(shirt.Color.Name)) { ShirtsFound.Add(shirt); ClCounts[ColorsIndex[shirt.Color.Name]].Count++; SzCounts[SizesIndex[shirt.Size.Name]].Count++; } } } } else { for (int shirtIndex = 0; shirtIndex < options.Sizes.Count; shirtIndex++) { foreach (var shirt in _shirts) { if (options.Sizes[shirtIndex].Name.Equals(shirt.Size.Name)) { if (options.Colors[shirtIndex].Name.Equals(shirt.Color.Name)) { ShirtsFound.Add(shirt); ClCounts[ColorsIndex[shirt.Color.Name]].Count++; SzCounts[SizesIndex[shirt.Size.Name]].Count++; } } } } } SearchResults sr = new SearchResults(); sr.Shirts = ShirtsFound; sr.SizeCounts = SzCounts; sr.ColorCounts = ClCounts; return(sr); }
private void SearchWithSizeAndColor(SearchOptions options, SearchResults searchResult) { foreach (var color in options.Colors) { foreach (var size in options.Sizes) { switch (color.Name + size.Name) { case "BlackSmall": var countBlackSmall = _sortedShirts["BlackSmall"].Count(); searchResult.Shirts.AddRange(_sortedShirts["BlackSmall"]); searchResult.SizeCounts.Where(x => x.Size == Size.Small).FirstOrDefault().Count += countBlackSmall; searchResult.ColorCounts.Where(x => x.Color == Color.Black).FirstOrDefault().Count += countBlackSmall; break; case "BlackMedium": var countBlackMedium = _sortedShirts["BlackMedium"].Count(); searchResult.Shirts.AddRange(_sortedShirts["BlackMedium"]); searchResult.SizeCounts.Where(x => x.Size == Size.Medium).FirstOrDefault().Count += countBlackMedium; searchResult.ColorCounts.Where(x => x.Color == Color.Black).FirstOrDefault().Count += countBlackMedium; break; case "BlackLarge": var countBlackLarge = _sortedShirts["BlackLarge"].Count(); searchResult.Shirts.AddRange(_sortedShirts["BlackLarge"]); searchResult.SizeCounts.Where(x => x.Size == Size.Large).FirstOrDefault().Count += countBlackLarge; searchResult.ColorCounts.Where(x => x.Color == Color.Black).FirstOrDefault().Count += countBlackLarge; break; case "WhiteSmall": var countWhiteSmall = _sortedShirts["WhiteSmall"].Count(); searchResult.Shirts.AddRange(_sortedShirts["WhiteSmall"]); searchResult.SizeCounts.Where(x => x.Size == Size.Small).FirstOrDefault().Count += countWhiteSmall; searchResult.ColorCounts.Where(x => x.Color == Color.White).FirstOrDefault().Count += countWhiteSmall; break; case "WhiteMedium": var countWhiteMedium = _sortedShirts["WhiteMedium"].Count(); searchResult.Shirts.AddRange(_sortedShirts["WhiteMedium"]); searchResult.SizeCounts.Where(x => x.Size == Size.Medium).FirstOrDefault().Count += countWhiteMedium; searchResult.ColorCounts.Where(x => x.Color == Color.White).FirstOrDefault().Count += countWhiteMedium; break; case "WhiteLarge": var countWhiteLarge = _sortedShirts["WhiteLarge"].Count(); searchResult.Shirts.AddRange(_sortedShirts["WhiteLarge"]); searchResult.SizeCounts.Where(x => x.Size == Size.Large).FirstOrDefault().Count += countWhiteLarge; searchResult.ColorCounts.Where(x => x.Color == Color.White).FirstOrDefault().Count += countWhiteLarge; break; case "YellowSmall": var countYellowSmall = _sortedShirts["YellowSmall"].Count(); searchResult.Shirts.AddRange(_sortedShirts["YellowSmall"]); searchResult.SizeCounts.Where(x => x.Size == Size.Small).FirstOrDefault().Count += countYellowSmall; searchResult.ColorCounts.Where(x => x.Color == Color.Yellow).FirstOrDefault().Count += countYellowSmall; break; case "YellowMedium": var countYellowMedium = _sortedShirts["YellowMedium"].Count(); searchResult.Shirts.AddRange(_sortedShirts["YellowMedium"]); searchResult.SizeCounts.Where(x => x.Size == Size.Medium).FirstOrDefault().Count += countYellowMedium; searchResult.ColorCounts.Where(x => x.Color == Color.Yellow).FirstOrDefault().Count += countYellowMedium; break; case "YellowLarge": var countYellowLarge = _sortedShirts["YellowLarge"].Count(); searchResult.Shirts.AddRange(_sortedShirts["YellowLarge"]); searchResult.SizeCounts.Where(x => x.Size == Size.Large).FirstOrDefault().Count += countYellowLarge; searchResult.ColorCounts.Where(x => x.Color == Color.Yellow).FirstOrDefault().Count += countYellowLarge; break; case "BlueSmall": var countBlueSmall = _sortedShirts["BlueSmall"].Count(); searchResult.Shirts.AddRange(_sortedShirts["BlueSmall"]); searchResult.SizeCounts.Where(x => x.Size == Size.Small).FirstOrDefault().Count += countBlueSmall; searchResult.ColorCounts.Where(x => x.Color == Color.Blue).FirstOrDefault().Count += countBlueSmall; break; case "BlueMedium": var countBlueMedium = _sortedShirts["BlueMedium"].Count(); searchResult.Shirts.AddRange(_sortedShirts["BlueMedium"]); searchResult.SizeCounts.Where(x => x.Size == Size.Medium).FirstOrDefault().Count += countBlueMedium; searchResult.ColorCounts.Where(x => x.Color == Color.Blue).FirstOrDefault().Count += countBlueMedium; break; case "BlueLarge": var countBlueLarge = _sortedShirts["BlueLarge"].Count(); searchResult.Shirts.AddRange(_sortedShirts["BlueLarge"]); searchResult.SizeCounts.Where(x => x.Size == Size.Large).FirstOrDefault().Count += countBlueLarge; searchResult.ColorCounts.Where(x => x.Color == Color.Blue).FirstOrDefault().Count += countBlueLarge; break; case "RedSmall": var countRedSmall = _sortedShirts["RedSmall"].Count(); searchResult.Shirts.AddRange(_sortedShirts["RedSmall"]); searchResult.SizeCounts.Where(x => x.Size == Size.Small).FirstOrDefault().Count += countRedSmall; searchResult.ColorCounts.Where(x => x.Color == Color.Red).FirstOrDefault().Count += countRedSmall; break; case "RedMedium": var countRedMedium = _sortedShirts["RedMedium"].Count(); searchResult.Shirts.AddRange(_sortedShirts["RedMedium"]); searchResult.SizeCounts.Where(x => x.Size == Size.Medium).FirstOrDefault().Count += countRedMedium; searchResult.ColorCounts.Where(x => x.Color == Color.Red).FirstOrDefault().Count += countRedMedium; break; case "RedLarge": var countRedLarge = _sortedShirts["RedLarge"].Count(); searchResult.Shirts.AddRange(_sortedShirts["RedLarge"]); searchResult.SizeCounts.Where(x => x.Size == Size.Large).FirstOrDefault().Count += countRedLarge; searchResult.ColorCounts.Where(x => x.Color == Color.Red).FirstOrDefault().Count += countRedLarge; break; default: break; } } } }
public SearchResults LookupSearch(SearchOptions options) { //Intitialize search result SearchResults results = new SearchResults() { ColorCounts = new List <ColorCount>(), SizeCounts = new List <SizeCount>(), Shirts = new List <Shirt>() }; // Convert to Lookup Stopwatch sw = new Stopwatch(); sw.Start(); var shirtsLookup = _shirts.ToLookup(x => new { x.Color, x.Size }); sw.Stop(); results.Milliseconds = sw.ElapsedMilliseconds; //Search if (options != null) { foreach (Color color in options.Colors) { ColorCount colorCount = new ColorCount() { Color = color, Count = 0 }; foreach (Size sz in Size.All) { var colourMatchedShirts = shirtsLookup[new { Color = color, Size = sz }]; if (options.Sizes.Contains(sz) && options.Sizes.Count > 0) { if (colourMatchedShirts.Count() > 0) { colorCount.Count += colourMatchedShirts.Count(); results.Shirts.AddRange(colourMatchedShirts.ToList <Shirt>()); SizeCount sizeCount = results.SizeCounts.Find(item => item.Size.Name.Equals(sz.Name)); if (sizeCount == null) { results.SizeCounts.Add(new SizeCount { Size = sz, Count = colourMatchedShirts.Count() }); } else { sizeCount.Count++; } } } else if (options.Sizes.Count == 0) { colorCount.Count += colourMatchedShirts.Count(); } } results.ColorCounts.Add(colorCount); } } return(results); }