internal string buildID(Item item) { string s = ""; ESort[] sorts = new ESort[] { sort1, sort2, sort3, sort4 }; for (int i = 0; i < sorts.Count(); i++) { switch (sorts[i]) { case ESort.对象名: if (!string.IsNullOrWhiteSpace(item.obj)) { s += (i == 0 ? "" : ".") + item.obj; } break; case ESort.属性名: if (!string.IsNullOrWhiteSpace(item.property)) { s += (i == 0 ? "" : ".") + item.property; } break; case ESort.状态: if (!string.IsNullOrWhiteSpace(item.status)) { s += (i == 0 ? "" : ".") + item.status; } break; case ESort.标志: if (!string.IsNullOrWhiteSpace(item.flag)) { s += (i == 0 ? "" : ".") + item.flag; } break; } } return(s); }
public SortItem(Expression expressionBody, ESort sortType) { ExpressionBody = expressionBody; SortType = sortType; }
/// <summary> /// Sort DatatableRecords.aaData based on the given column number and sort direction /// </summary> /// <param name="aaData">DatatableRecords table data to be sorted</param> /// <param name="columnNumber">Column to sort on</param> /// <param name="customParsers">[Optional] A dictionary containing the column number as an associated data parser function. /// Defaults to null.</param> /// <param name="type">Sort direction</param> public static IEnumerable <string[]> Sort(this IEnumerable <IEnumerable <string> > aaData, int columnNumber, ESort type, IDictionary <int, Func <string, object> > customParsers = null) { string[][] data = new string[0][]; if (aaData == null) { return(data); } IEnumerable <IEnumerable <string> > enumerable = aaData as IEnumerable <string>[] ?? aaData.ToArray(); if (enumerable.Count() > 1) { data = (type == ESort.Ascending) ? SortAscending(enumerable, columnNumber, customParsers) : SortDescending(enumerable, columnNumber, customParsers); } else { data = enumerable.Select(f => f.ToArray()).ToArray(); } return(data); }
public MarketSearch Search( string query = "", int start = 0, int count = 10, bool searchInDescriptions = false, int appId = 0, EMarketSearchSortColumns sortColumn = EMarketSearchSortColumns.Name, ESort sort = ESort.Desc, IDictionary <string, string> custom = null) { var urlQuery = new Dictionary <string, string> { { "query", query }, { "start", start.ToString() }, { "count", count.ToString() }, { "search_descriptions", (searchInDescriptions ? 1 : 0).ToString() }, { "appid", appId.ToString() }, { "sort_column", MarketUtils.FirstCharacterToLower(sortColumn.ToString()) }, { "sort_dir", MarketUtils.FirstCharacterToLower(sort.ToString()) } }; if (custom != null && custom.Count > 0) { urlQuery = urlQuery.Concat(custom).ToDictionary(x => x.Key, x => x.Value); } var resp = this.steam.Request( Urls.Market + "/search/render/", Method.GET, Urls.Market, urlQuery, true, proxy: this.Proxy); var respDes = JsonConvert.DeserializeObject <JMarketSearch>(resp.Data.Content); if (!respDes.Success) { throw new SteamException("Failed Search"); } var marketSearch = new MarketSearch(); if (respDes.TotalCount <= 0) { return(marketSearch); } marketSearch.TotalCount = respDes.TotalCount; var html = respDes.ResultsHtml; var doc = new HtmlDocument(); doc.LoadHtml(html); var itemNodes = doc.DocumentNode.SelectNodes("//a[@class='market_listing_row_link']"); if (itemNodes == null || itemNodes.Count <= 0) { return(marketSearch); } var tempIndex = 0; foreach (var item in itemNodes) { tempIndex++; var nameNode = item.SelectSingleNode(".//span[@class='market_listing_item_name']"); if (nameNode == null) { throw new SteamException($"Cannot parse item name. Index [{tempIndex}]"); } var name = nameNode.InnerText; var gameNode = item.SelectSingleNode(".//span[@class='market_listing_game_name']"); if (gameNode == null) { throw new SteamException($"Cannot parse game name. Index [{tempIndex}]"); } var game = gameNode.InnerText; var imageUrlNode = item.SelectSingleNode(".//img[@class='market_listing_item_img']"); var imageUrl = imageUrlNode?.Attributes["srcset"]?.Value; var urlAttr = item.Attributes["href"]; if (urlAttr == null) { throw new SteamException($"Cannot find item url. Item [{name}], Index [{tempIndex}]"); } var url = urlAttr.Value; var quantityNode = item.SelectSingleNode(".//span[@class='market_listing_num_listings_qty']"); if (quantityNode == null) { throw new SteamException($"Cannot find quantity. Item [{name}], Index [{tempIndex}]"); } var quantityParse = int.TryParse( quantityNode.InnerText, NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out var quantity); if (!quantityParse) { throw new SteamException($"Cannot parse quantity. Item [{name}], Index [{tempIndex}]"); } var minPriceNode = item.SelectSingleNode(".//span[@class='normal_price']"); if (minPriceNode == null) { throw new SteamException($"Cannot find item price. Item [{name}], Index [{tempIndex}]"); } var minPriceClean = minPriceNode.InnerText.Split(' ')[0]; var minPriceParse = double.TryParse( minPriceClean, NumberStyles.Currency, CultureInfo.GetCultureInfo("en-US"), out var minPrice); if (!minPriceParse) { throw new SteamException($"Cannot parse min. price. Item [{name}], Index [{tempIndex}]"); } marketSearch.Items.Add( new MarketSearchItem { ImageUrl = imageUrl, Name = name, Quantity = quantity, Game = game, Url = url, MinPrice = minPrice, HashName = MarketUtils.HashNameFromUrl(url), AppId = MarketUtils.AppIdFromUrl(url) }); } return(marketSearch); }
public static IOrderedQueryable <TSource> AscOrDescOrder <TSource>(this IQueryable <TSource> query, ESort eSort, string propertyName) { var entityType = typeof(TSource); var propertyInfo = entityType.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase); if (propertyInfo is null) { propertyInfo = entityType.GetProperty("Id"); } ParameterExpression arg = Expression.Parameter(entityType, "x"); MemberExpression property = Expression.Property(arg, propertyInfo.Name); var selector = Expression.Lambda(property, new ParameterExpression[] { arg }); var enumarableType = typeof(Queryable); var sortType = eSort == ESort.ASC ? "OrderBy" : "OrderByDescending"; var method = enumarableType.GetMethods() .Where(m => m.Name == sortType && m.IsGenericMethodDefinition) .Where(m => { var parameters = m.GetParameters().ToList(); return(parameters.Count == 2); }).Single(); MethodInfo genericMethod = method.MakeGenericMethod(entityType, propertyInfo.PropertyType); var newQuery = (IOrderedQueryable <TSource>)genericMethod.Invoke(genericMethod, new object[] { query, selector }); return(newQuery); }
/// <summary> /// Constructor to setup column number and sort type /// </summary> /// <param name="columnNumber">Column number</param> /// <param name="sort">[Optional] Sort type. Defaults to ascending.</param> public AASort(int columnNumber, ESort sort = ESort.Ascending) { this.columnNumber = columnNumber; sortType = sort.GetStringValue(); }