Вычисление ценовых диапазонов с помощью LINQ и соответствующих номеров продаж

#c# #asp.net #asp.net-mvc #linq #c#-4.0

#c# #asp.net #asp.net-mvc #linq #c #-4.0

Вопрос:

для начала у меня есть класс, который в основном представляет все транзакции для определенных элементов, обычно это 100 элементов, для которых у меня есть транзакции. Класс выглядит следующим образом:

 public class RawTransactions
    {
        public string SellerName { get; set; }
        public int FeedBackScore { get; set; }
        public int QuantityPurchased { get; set; }
        public DateTime TransactionDate { get; set; }
        public string ProductTitle { get; set; }
        public double CurrentPrice { get; set; }
        public double SalePrice { get; set; }
        public string ItemID { get; set; }
        public string Date { get; set; }
    }
  

Основываясь на этом классе и транзакциях внутри списка этого типа, я создал функцию, которая в основном принимает наименьшую и наибольшую цену продажи любой транзакции, присутствующей в списке, и создает диапазон цен в 7 этапов

 private List<double> GetRangeForElements(double minPrice, double maxPrice)
   {
     double step = (maxPrice - minPrice) / 7.00d;
     return Enumerable.Range(0, 8).Select(i => minPrice   i * step).ToList();
   }
  

Так, например, если я передам 0 долларов (наименьшая цена продажи) и 10 долларов (наибольшая цена продажи), это создаст список из 7 ценовых диапазонов, подобных следующему:

 0
1.5
3
4.5
6
7.5
9
10
  

Это можно интерпретировать как:

 0 - 1.5 price range
1.5 - 3 price range
3 - 4.5 price range
4.5 - 6 price range
6 - 7.5 price range

// and so on...
  

Использование заключается в следующем:

 var ranges = GetRangeForElements(0,10); // Here I will have the ranges now
  

Теперь, основываясь на этих диапазонах, которые были только что созданы, и существующих транзакциях, которые у меня есть, мне нужно определить следующие параметры:

  • Ценовой диапазон
  • Сколько продаж конкретного ItemId имеет продаж для определенного диапазона
  • У скольких продавцов (на основе свойства SellerName) были продажи по определенному ценовому диапазону
  • Сколько продавцов (опять же на основе свойства SellerName) НЕ было продаж по определенному ценовому диапазону

Я не совсем уверен, как я могу теперь объединить все эти данные, чтобы получить эти параметры с помощью LINQ? Кто-нибудь может мне помочь с этим?

P.S. ребята, транзакции по всем элементам хранятся в списке, подобном следующему:

 var allItemsTransactions = new List<ProductResearchRawTransactions>();
  

P.S. ребята, это существующее решение, которое у меня есть, но оно дает мне совершенно неправильные результаты:

 var priceRanges = ranges.Select(r => new PriceRangeGraph
                {
                    Price = Math.Round(r, 2),
                    Sales = allItemsTransactions.Where(x => ranges.FirstOrDefault(y => y >= x.SalePrice) == r).Sum(x => x.QuantityPurchased),
                    SuccessfulSellers = allItemsTransactions.Where(x => ranges.FirstOrDefault(y => y >= x.SalePrice) == r).GroupBy(x => new { x.SellerName, x.QuantityPurchased }).Where(x => x.Key.QuantityPurchased > 0).Select(x => x.Key.SellerName).Count(),
                    UnSuccessfulSellers = allItemsTransactions.Where(x => ranges.FirstOrDefault(y => y >= x.SalePrice) == r).GroupBy(x => new { x.SellerName, x.QuantityPurchased }).Where(x => x.Key.QuantityPurchased == 0).Select(x => x.Key.SellerName).Count(),
                }).ToList();
  

Комментарии:

1. Вы знаете, что SO не является бесплатным сервисом кодирования?

2. @Selvin Нет, я не это искал, у меня было решение, которое я пробовал, я публикую его сейчас, но оно дает мне совершенно неправильные результаты

3. @Selvin Я опубликовал первоначальное решение, которое у меня есть

4. realranges.Select(r=>new {r, items = allItemsTransactions.Select(t=>t.SalePrice >= r.Item1 amp;amp; t.SalePrice < r.Item2).ToDictionary(a=>a.r, a.items) где realranges находится Tuple<double, double> … я не тестировал это, но вам нужно что-то вроде этого…

5. @Selvin Не уверен, что мне делать дальше с кортежем?: D