如何在 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 =>
先生,我有这个 'public IListCannot implicitly convert type 'System.Collections.Generic.List<<anonymous type: string Id, string Status>>' to 'System.Collections.Generic.IList<T>'. An explicit conversion exists (are you missing a cast?)
你可以这样做:
虽然你可以用更简单的方式来做,但这只是为了更好地理解
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 分组的主要内容,如果未能解决你的问题,请参考以下文章