Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 6
0
 /// <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();
 }