我写了一个自定义排序LINQ扩展方法,如下所示,但我认为它可以针对大结果进行优化。
以下是代码:
public static IEnumerable<T> OrderByAncesty<T>(this IEnumerable<T> source, Func<T, DateTime> dateSelector, Func<T, float> scoreSelector)
{
var original = source.ToList();
var maxDate = source.Max(dateSelector);
var list = from p in original
let date = dateSelector(p)
let score = scoreSelector(p)
let date1 = date.ToOADate()
let date2 = maxDate.ToOADate()
let ancesty = (1 - (float)date1 / (float)date2) * score
select new
{
TObject = p,
Ancesty = ancesty
};
return list.OrderBy(p => p.Ancesty).Select(p => p.TObject);
}
答案 0 :(得分:3)
每个“let”子句都会增加一个额外的委托级别。你可以通过删除它们来改善一些事情。您也不需要匿名类型 - 或者很可能需要ToList()
调用。此外,每次在ToOADate()
上调用maxDate
都没有意义。
public static IEnumerable<T> OrderByAncesty<T>(this IEnumerable<T> source,
Func<T, DateTime> dateSelector, Func<T, float> scoreSelector)
{
var maxDate = (float) source.Max(dateSelector).ToOADate();
return original.OrderBy(p =>
(1 - (float)dateSelector(p).ToOADate() / maxDate))
* scoreSelector(p));
}
请注意,如果没有“let”条款,请注意清楚。