public async Task <IEnumerable <ProductDto> > GetSortedProductsAsync(ProductSortOptions sortOption) { var products = await client.GetProductsAsync(); if (sortOption != ProductSortOptions.Recommended) { var orderBy = SortOptionsToOrderBy(sortOption); return(products.AsQueryable().OrderBy(orderBy)); } var popularProducts = await GetShoppingHistories(); var productsList = products.ToList(); productsList.Sort((x, y) => { double?xValue = null; double?yValue = null; if (popularProducts.ContainsKey(x.Name)) { xValue = popularProducts[x.Name]; } if (popularProducts.ContainsKey(y.Name)) { yValue = popularProducts[y.Name]; } if (xValue.HasValue && yValue.HasValue) { return(yValue.Value.CompareTo(xValue.Value)); } if (xValue.HasValue) { return(-1); } if (yValue.HasValue) { return(1); } return(string.Compare(x.Name, y.Name, StringComparison.OrdinalIgnoreCase)); }); return(productsList); }
private string SortOptionsToOrderBy(ProductSortOptions sortOptions) { switch (sortOptions) { case ProductSortOptions.Ascending: return($"{nameof(ProductDto.Name)} ascending"); case ProductSortOptions.Descending: return($"{nameof(ProductDto.Name)} descending"); case ProductSortOptions.High: return($"{nameof(ProductDto.Price)} descending"); case ProductSortOptions.Low: return($"{nameof(ProductDto.Price)} ascending"); case ProductSortOptions.Recommended: throw new ArgumentException(); } return(null); }