【问题标题】:Find MAX/MIN list item using LINQ?使用 LINQ 查找 MAX/MIN 列表项?
【发布时间】:2013-08-22 06:13:53
【问题描述】:

我有一个列表,其中包含多个项目和 3 个道具 ID、DATE、COMMENT.ID 字段在数据库中自动递增。

假设列表包含

2,16AUG,CommentMODIFIED
1,15AUG,CommentFIRST
3,18AUG,CommentLASTModified

我想要一个 ITEM.Item 具有最小 DATE 和最新评论。在这种情况下

1,15AUG,CommentLASTModified

使用 LINQ 的任何简单方法。

【问题讨论】:

  • 1,15AUG,CommentLASTModified 此行由数据库中的不同行组成。这就是你想要的吗?
  • 基本上我想要一条记录最短日期和最新评论
  • 1,15AUG,CommentFIRST - 是具有最短日期的记录。 3,18AUG,CommentLASTModified 是最新评论的记录。您想要这些记录的组合

标签: c# asp.net .net linq list


【解决方案1】:
orderedItems = items.OrderBy(x => x.Date);

var result = items.First();
result.Comment = items.Last().Comment;

【讨论】:

    【解决方案2】:

    要从列表中取出单个项目,您可以订购这些项目,然后取出第一个,如下所示:

    var result = items
        .OrderByDescending(x => x.Date)
        .First();
    

    但如果items 集合为空,First 将抛出异常。这样比较安全:

    var result = items
        .OrderByDescending(x => x.Date)
        .FirstOrDefault();
    

    要获得 不同 列的最小值/最大值,您可以这样做:

    var result = 
        new Item {
             Id = 1,
             Date = items.Min(x => x.Date),
             Comment = items.Max(x => x.Comment)
        };
    

    但这需要两次访问数据库。这可能会更有效率:

    var result = 
        (from x in items
         group x by 1 into g
         select new Item {
             Id = 1,
             Date = g.Min(g => g.Date),
             Comment = g.Max(g => g.Comment)
         })
        .First();
    

    或者用流利的语法:

    var result = items
        .GroupBy(x => 1)
        .Select(g => new Item {
             Id = 1,
             Date = g.Min(g => g.Date),
             Comment = g.Max(g => g.Comment)
         })
        .First();
    

    【讨论】:

    • items.Min(x => x.Comment) 这可能会选择错误的评论
    • @IlyaIvanov 你说得对,应该是“latest”评论,即.Max(x => x.Comment)(假设这实际上是问题似乎暗示的日期)
    • @p.s.w.g 我怀疑它是。我把它读作“8 月 18 日的评论”。您的代码将以最高字母顺序获得注释,这基本上是随机的。不过,+1 作为您的答案更加彻底。
    • 这种数据库设计是一种常见的反模式,他们希望保留整个评论历史记录(而不是重写它),而不是创建一个新表来保存所有相关的 cmets,只需添加新记录到系统。花足够的时间做顾问,你就会学会 AAAAAAWLLLL 的反模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2020-11-01
    • 2021-05-04
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多