示例#1
0
        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);
        }