我有一个字符串列表,我想按数量订购。 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
的订单数量列表。
实现这一目标的好方法是什么?
由于
答案 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
)。希望这能解决所有问题。