11

当我想从 中检索属性中具有最高值的对象时DateTimeIEnumerable可以执行以下操作:

var maxDate = myEnumerable.Max(x => x.TheDateTimeProperty);
var wantedObject = myEnumerable.FirstOrDefault(x => x.TheDateTimeProperty == maxDate);

如果没有获得第一个,这可能maxDate吗?例如像这样:

var wantedObject = myEnumerable.GetByMaxDate(x => x.TheDateTimeProperty);

我知道我可以写一个扩展方法GetByMaxDate,但我想知道是否已经有 linq 提供的方法。

只是为了澄清:不寻找其他可能性来写这个。我只是对是否存在一种方法感兴趣。(更少的代码,由该方法管理的最佳性能)

4

3 回答 3

13

优点:它应该与“任何”linq 提供程序(对象、实体、sql)一起使用

myEnumerable.OrderByDescending(x => x.TheDateTimeProperty).First();

缺点:正如 Matthew Watson 在评论中指出的那样,它不会在(非常)大的列表上表现出色。

于 2013-03-11T09:41:35.470 回答
2

我更喜欢像您最初所说的那样首先获得 maxDate 。使用您已经使用的语法我没有发现任何问题。

但是,如果需要,您可以像这样简写代码:

var wantedObject = myEnumerable.FirstOrDefault(x => x.TheDateTimeProperty == myEnumerable.Max(x => x.TheDateTimeProperty));

(此代码未经测试,可能需要一些类型转换)

或者您可以编写一个存储过程并从中获取数据。

但是我不再喜欢 OrderByDescending.First 了。如果在物理上您的表中的数据按您指定的属性升序排序,那很好。但如果没有,那么您的 sql 表将需要进行降序排序,并且可能会从中获得高负载。特别是当表有超过1m的记录并且DateTime以升序存储在物理中时。

使用 max 可以产生比它更好(更快/更轻量)的结果。

于 2013-03-11T09:49:07.540 回答
0

由于没有其他答案,并且linq中不存在内置方法,我将写下我将使用的内容。

对于对象的 linq:

Habib 在评论中提到的MaxBy来自morelinq的方法。

对于 linq 到 sql:

我会写一个扩展方法:

public static TSource SqlMaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector)
{   
  var maxValue = source.Max(selector);
  return source.FirstOrDefault(value => selector(value).Equals(maxValue));
}
于 2013-03-14T12:10:30.193 回答