如何获得列出大多数日期的月份

时间:2013-11-17 17:25:07

标签: c# algorithm

我有这个网址,我得到了HTML,我可以废弃任何内容,没有任何问题。

我可以在数组中获取所有这些日期,列出任何内容。

我的问题是,我想知道哪个是最重复的月份。

示例here

 User ID                                    Price    Quantity   Date of Purchase
 n***m ( 34Feedback score is 10 to 49)      GBP 1.95    1   Nov-11-13 12:33:49 PST   
 v***e ( 260Feedback score is 100 to 499)   GBP 1.95    1   Nov-07-13 04:52:25 PST   
 r***t ( 340Feedback score is 100 to 499)   GBP 1.95    1   Nov-05-13 19:14:07 PST   
 c***a ( 341Feedback score is 100 to 499)   GBP 1.95    1   Nov-03-13 01:33:42 PST   
 c***m ( 669Feedback score is 500 to 999)   GBP 1.95    1   Nov-02-13 12:08:03 PDT   
 1***a ( 158Feedback score is 100 to 499)   GBP 1.95    1   Nov-02-13 09:15:35 PDT   
 t***r ( 60Feedback score is 50 to 99)      GBP 1.95    1   Nov-01-13 15:13:37 PDT   
 o***o ( 84Feedback score is 50 to 99)      GBP 1.95    1   Oct-29-13 09:36:58 PDT   
 i***0 ( 10Feedback score is 10 to 49)      GBP 1.95    1   Oct-27-13 14:57:35 PDT   
 m***a ( 476Feedback score is 100 to 499)   GBP 1.95    1   Oct-23-13 08:58:14 PDT   
 u***e ( 20Feedback score is 10 to 49)      GBP 1.95    1   Oct-22-13 05:15:39 PDT   
 l***w ( 101Feedback score is 100 to 499)   GBP 1.95    1   Oct-17-13 10:55:17 PDT   
 6***6 ( 504Feedback score is 500 to 999)   GBP 1.95    1   Oct-15-13 15:31:10 PDT   
 m***c ( 329Feedback score is 100 to 499)   GBP 1.95    1   Oct-09-13 07:22:49 PDT   
 e***e ( 313Feedback score is 100 to 499)   GBP 1.95    1   Oct-03-13 22:39:48 PDT   
 0***z ( 11Feedback score is 10 to 49)      GBP 1.95    1   Oct-02-13 09:18:02 PDT   
 k***. ( 128Feedback score is 100 to 499)   GBP 1.95    1   Oct-01-13 10:02:15 PDT   
 v***v ( 127Feedback score is 100 to 499)   GBP 1.95    1   Sep-30-13 09:41:30 PDT   
 n***g ( 32Feedback score is 10 to 49)      GBP 1.95    1   Sep-30-13 09:19:57 PDT

你会看到一个项目已售出的历史记录有很多个月。如何获得最多日期的月份?在这里,September。我想这样做是因为这样我可以获得更准确的销售历史数据,因为我必须计算月平均值。有什么想法吗?

我正在考虑将它全部放入DataTable中,如:

Price   Quantity    Date    DateMonth
10             1         Nov-11-13  Nov
34             2         Nov-10-13  Nov
10             3         Oct-11-13  Oct
20             1         Oct-9-13   Oct
20             1         Oct-7-13   Oct

如果这样做,我们仍然无法直接使用查询来计算最大月份吗?

2 个答案:

答案 0 :(得分:2)

发表评论 - 以下是您可能正在寻找的答案:

var query = from d in DateMonth
            group d by d into g
            select new {g.Key, Count = g.Count()};

int MostAppearingMonthAmount = query.Max(g => g.Count);

IEnumerable<string> MostAppearingMonth = query
                                      .Where(g => g.Count == MostAppearingMonthAmount)
                                      .Select(g => g.Key);

您现在有一个列表,其中包含月份(或月份,如果有2个月或更多个月,且具有相同的金额),可以迭代。为了获得一个月,您可以使用简单的“.FirstOrDefault()”来使用该语句,并使用字符串而不是IEnumerable。

现在您需要做的就是计算您在给定月份的需求。

答案 1 :(得分:0)

要获得最高日期,我首先将所有找到的日期转换为DateTime

MatchCollection matches = Regex.Matches(myString, @"[A-z]{1}[a-z]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}");

此正则表达式查找所有日期。

List<DateTime> dates = new List<DateTime>();
        foreach (Match item in matches)
        {
            dates.Add(DateTime.ParseExact(item.Value, "MMM-dd-yy HH:mm:ss", provider));
        }

我将日期转换为DateTime对象,并将它们按月分组:

List<List<DateTime>> groupedMonths = dates.GroupBy(x => x.Month).Select(grp => grp.ToList()).ToList();

然后我按照一个月的出现次数订购列表:

groupedMonths = groupedMonths.OrderByDescending(x => x.Count).ToList();

之后我通过调用List的第一个元素来获得最高月数:

  string highestCountMonth = string.Format("The month {0} has most dates. Count: {1}", CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(groupedMonths[0][0].Month), groupedMonths[0].Count);

The List of DateTimes ordered by Months

简而言之,就是这样:

List<List<DateTime>> groupedMonths = dates.GroupBy(x => x.Month).Select(grp => grp.ToList()).OrderByDescending(x => x.Count).ToList();