如何在 C# 中获取特定 id 的最长时间和按 id 分组

Posted

技术标签:

【中文标题】如何在 C# 中获取特定 id 的最长时间和按 id 分组【英文标题】:How to get maximum time of a particular id and group by id in C# 【发布时间】: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)

【问题讨论】:

【参考方案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;

【讨论】:

一般来说,我们有一条规则,即我们不会发布本质上与之前发布的答案重复的答案,尤其是当它们只是零解释的代码块时

以上是关于如何在 C# 中获取特定 id 的最长时间和按 id 分组的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 和按对象 id 过滤 mongodb

socket.io 和按对象 id 过滤 mongodb

JWT:如何从声明中的特定键获取值列表。 C# Asp.Net 核心

C#如何通过ID从数据表中获取两列值

couchdb 按值、限制和按时间顺序获取

从 C# 中的数据表中获取单元格值