【问题标题】:How to get maximum time of a particular id and group by id in C#如何在 C# 中获取特定 id 的最长时间和按 id 分组
【发布时间】:2021-06-11 02:07:44
【问题描述】:

我有以下代码,这是一个示例代码,只需要创建示例列表来显示客户端数据。

class Program
{
    static void Main(string[] args)
    {
        List<Author> authors = new List<Author>
        {
            new Author { Id = "100", Status = "A", Value = "100", dateTime = dt1.AddMinutes(-5) },
            new Author { Id = "101", Status = "A", Value = "100", dateTime = dt1.AddMinutes(-8)  },
            new Author { Id = "100", Status = "A", Value = "200", dateTime = dt1.AddMinutes(-6)  },
            new Author { Id = "100", Status = "A", Value = "250" , dateTime = dt1.AddMinutes(-18)},
            new Author { Id = "101", Status = "A", Value = "600" , dateTime = dt1.AddMinutes(-6)},
            new Author { Id = "100", Status = "A", Value = "700" , dateTime = dt1.AddMinutes(-3)}
        };

        var aa = authors.ToList();
    }
}

public class Author
{
    public string Id { get; set; }
    public string Status { get; set; }
    public string Value { get; set; }
    public dateTime dateTime { get; set; }
}

我需要使用它们的最大 dateTime 值获取不同的 Id。

按照我的预期,输出应该是这两个列表值:

new Author { Id = "100", Status = "A", Value = "700" , dateTime = dt1.AddMinutes(-3)}
new Author { Id = "101", Status = "A", Value = "600" , dateTime = dt1.AddMinutes(-6)}

【问题讨论】:

    标签: c# lambda group-by


    【解决方案1】:

    使用 LINQ 它看起来像:

    var r = authors.GroupBy(a => a.Id).Select(g =>
      new { Id = g.Key, MaxDate = g.Max(a => a.dateTime) }
    );
    

    如果你确实想要 Author 对象,它是:

    var r = authors.GroupBy(a => a.Id).Select(g =>
      g.OrderByDescending(a => a.dateTime).First()
    );
    

    在上面,我别名为 a 的所有内容都是 Author 对象,g 是 IGrouping - 在本例中是共享相同 id 的作者列表。

    GroupBy 本质上返回作者列表的列表。外部列表有一个 Key,它是内部列表中的所有内容共享的内容,在这种情况下是相同的作者 ID。这意味着选择会提取共享密钥,然后对共享该密钥的所有作者对象执行最大值,以查找每个密钥的最高日期时间

    如果您知道 sql 分组,了解 LINQ 分组的主要内容是,与 sql 不同,LINQ 不一定丢弃任何信息,它只是将数据划分为共享属性下的组,但您仍然拥有所有进入其中的数据。相比之下,sql 分组也进入了执行聚合的下一步,并且只为您提供分组操作的结果 - 使用 sql 您必须指定一些聚合,而使用 linq 则不需要

    【讨论】:

    • 什么是g?你能看看那个先生吗
    • 编译错误,:名称'g'在当前上下文中不存在
    • g 是 GroupBy 操作产生的 IGrouping。检查您的选择是否有g =&gt;
    • 先生,我有这个 'public IList rows { get;放; }'。我需要将上述查询结果分配给此。一旦我尝试这样做,我就会得到 ,Cannot implicitly convert type 'System.Collections.Generic.List&lt;&lt;anonymous type: string Id, string Status&gt;&gt;' to 'System.Collections.Generic.IList&lt;T&gt;'. An explicit conversion exists (are you missing a cast?)
    • T 是什么?一位作家?如果是这样,您需要在 r 上调用 ToList(),但我发布的第二个查询返回作者,而不是第一个返回 id/时间对的查询。你的问题不是特别清楚输出是什么,也没有提到你将如何使用它
    【解决方案2】:

    你可以这样做:

    虽然你可以用更简单的方式来做,但这只是为了更好地理解

            var temp = authors.GroupBy(t => t.Id)
                              .Select(t => new Author { Id=t.Key, dateTime = t.Max(f =>f.dateTime) }).ToList();
    
    //Select by LINQ query
            var query = from n in authors
                        join t in temp on new { n.Id, n.dateTime } equals new { t.Id, t.dateTime }
                        select n;
    

    【讨论】:

    • 一般来说,我们有一条规则,即我们不会发布本质上与之前发布的答案重复的答案,尤其是当它们只是零解释的代码块时
    猜你喜欢
    • 1970-01-01
    • 2015-10-15
    • 2012-09-26
    • 1970-01-01
    • 2016-04-14
    • 2017-10-15
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多