按数量订购字符串列表

时间:2014-04-07 11:22:21

标签: c# linq list

我有一个字符串列表,我想按数量订购。 List包含Order-CreationDate列表和datetime值。我正在将这些值转换为字符串,因为我将在以后需要它。

我当前的输出是CreationDate的列表,如下所示。

2014-04-05
2014-04-05
2014-04-05
2014-04-05
2014-04-06
2014-04-06
2014-04-06
...

我按预期获得了日期列表,但我希望按日期分组日期。这意味着我需要另一个带有总订单数量的变量。我尝试使用for循环和linq查询创建一个新变量,但没有得到我想要的结果。

如何按CreationDate获取订单数量?我需要按CreationDate计算订单总数,但我找不到办法来做到这一点。

预期输出为:

2014-04-05 4 - representing 4 orders that date
2014-04-06 3 - representing 3 orders that date.

这就是我的代码:

List<string> TotalOrdersPaid = new List<string>();

foreach (var order in orders)
{
    if (order.PaymentStatus == PaymentStatus.Paid)
    {
        string Created = order.CreatedOnUtc.Date.ToString("yyyy-MM-dd");
        order.CreatedOnUtc = DateTime.ParseExact(Created, "yyyy-MM-dd", CultureInfo.InvariantCulture);
        TotalOrdersPaid.Add(Created);
    }
}

例如,TotalOrdersPaid应包含CreationDate的订单数量列表。

实现这一目标的好方法是什么?

由于

2 个答案:

答案 0 :(得分:5)

基本上,你只需要一个小组by和order。

var result = orders//add any where clause needed
             .GroupBy(m => m)
             .Select(m => new {
                cnt = m.Count(),
                date = m.Key
             })
             .OrderByDescending(m => m.cnt);

当然,您可以在Select和/或项目中添加任何DateTime.Parse / ParseExact到相应的类。

答案 1 :(得分:2)

要按日期对订单进行分组,请使用以下LinQ lambda表达式:

var grouped = orders.Where(o => o.PaymentStatus == PaymentStatus.Paid)
                    .GroupBy(g => g.CreatedOnUtc);

现在,所有付费订单都按日期分组。要计算每个日期的订单,请选择作为日期的密钥,Count()将计算该日期的所有订单。

var counted = grouped.Select(s => new { Date = s.Key, Count = s.Count() });

修改

在一个声明中:

var result = orders.Where(o => o.PaymentStatus == PaymentStatus.Paid)
                   .GroupBy(g => g.CreatedOnUtc)
                   .Select(s => new { Date = s.Key, Count = s.Count() });

根据您的日期列表,输出将如下所示:

Date Count 5/04/2014 4 6/04/2014 3

<强>更新

如果要将更多属性放在将从Select()方法返回的匿名类型中,只需添加它们即可。例如,如果您想要日期,计数该日期的订单列表,请使用以下代码行:

var result = orders.Where(o => o.PaymentStatus == PaymentStatus.Paid)
                   .GroupBy(g => g.CreatedOnUtc)
                   .Select(s => new
                   {
                       Date = s.Key,
                       Count = s.Count(),
                       Items = s.ToList()
                   });

现在您可以执行以下操作:

foreach(var orderGroup in result)
{
    Console.WriteLine(String.Format("Number of orders for {0}: {1}", orderGroup.Date, orderGroup.Count));

    foreach(var order in orderGroup.Items)
    {
        Console.WriteLine(order.Name);
    }
}

这将遍历所有分组的项目并显示如下句子:

  

2014年5月4日的订单数量:4

然后它将显示该日期的每个订单的名称(如果您的订单具有属性Name)。希望这能解决所有问题。