【问题标题】:Order a list of string by quantity按数量排序字符串列表
【发布时间】:2015-07-18 19:28:46
【问题描述】:

我有一个我想按数量订购的字符串列表。该列表包含带有日期时间值的 Order-CreationDate 列表。我正在将此值转换为字符串,因为我稍后会需要它。

我当前的输出是一个如下所示的 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 的订单数。

有什么好的方法可以做到这一点?

谢谢

【问题讨论】:

  • 你能检查一下这是否有效吗? var grouppedDate = TotalOrdersPaid.GroupBy(x =&gt; x.Created);
  • 尝试了几乎相同的事情:orders.OrderBy(x => order.CreatedOnUtc);不工作或我做错了。我得到了一份清单,但订单数量非常多

标签: c# linq list


【解决方案1】:

基本上,您只需要一个按和排序的分组。

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,和/或项目到对应的类中。

【讨论】:

    【解决方案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)。希望这能清除一切。

    【讨论】:

    • 这很棒而且信息量很大。归档几乎没有代码,Linq 确实非常方便。 def 将来会考虑到这一点。谢谢!
    • 很高兴我能帮上忙。 :)
    • 如果我可能会问,我可以在列表中查询更多值还是仅限于一个键和值?结果还返回一个 AnonymousType1 列表,我可以访问 Date 或 Count 并返回它们吗?
    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 2020-07-17
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2015-09-09
    • 2012-04-03
    • 2018-07-02
    相关资源
    最近更新 更多