是的,如果序列是Story 项的序列,那应该可以工作;你有什么问题?请注意,如果 Score 不适用于任何实例,则可能值得将其设为静态。
另一种选择是让 Score() 方法成为 Story 上的实例方法或扩展方法。
请注意,这只适用于 LINQ-to-Objects;如果您使用的是 LINQ-to-SQL / LINQ-to-Entities 等,您要么需要对整个事物使用 lambda,要么(仅在 LINQ-to-SQL 中)使用 UDF 映射函数(在数据上- context) 来计算值。
使用原始语法的示例(LINQ-to-Objects):
using System.Linq;
using System;
class Story { // declare type
public DateTime PostedOn { get; set; }
// simplified purely for convenience
public int VotesCount { get; set; }
public int CommentsCount { get; set; }
}
static class Program {
static void Main() {
// dummy data
var data = new[] {
new Story { PostedOn = DateTime.Today,
VotesCount = 1, CommentsCount = 2},
new Story { PostedOn = DateTime.Today.AddDays(-1),
VotesCount = 5, CommentsCount = 22},
new Story { PostedOn = DateTime.Today.AddDays(-2),
VotesCount = 2, CommentsCount = 0}
};
var ordered = data.OrderByDescending(s=>Score(s));
foreach (var row in ordered)
{
Console.WriteLine(row.PostedOn);
}
}
private static double Score(Story s) {
DateTime now = DateTime.Now;
TimeSpan elapsed = now.Subtract(s.PostedOn);
double daysAgo = elapsed.TotalDays;
// simplified purely for convenience
return s.VotesCount + s.CommentsCount - daysAgo;
}
}
添加this(即Score(this Story s)),即可使用:
.OrderByDescending(s=>s.Score())